On Sun, Jan 26, 2014 at 8:52 PM, Nick Coghlan <ncogh...@gmail.com> wrote:

> There's also the fact that breaking working code in a maintenance release
> is always dubious, especially when there's no current supported way to get
> the equivalent behaviour prior to the maintenance release. This is the kind
> of change that will require a note in the "porting to Python 3.5" section
> of the What's New, again suggesting strongly that we can't change it in the
> maintenance releases.


It looks like there is more than one bug related to passing negative times
as a keyword argument:

>>> from itertools import *
>>> ''.join(repeat('a', times=-4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to int

itertools.repeat() is documented [1] as being equivalent to:

def repeat(object, times=None):
    # repeat(10, 3) --> 10 10 10
    if times is None:
        while True:
            yield object
    else:
        for i in range(times):
            yield object

The behavior of the CPython implementation is clearly wrong.  If there are
people relying on it - they already have code that would break in other
implementations.  (I would say not accepting None for times is a bug as
well if you read the docs literally.)

When implementation behavior differs from documentation it is a bug by
definition and a fix should go in bug-fix releases.  Reproducing old
behavior is fairly trivial using an old_repeat(object, *args, **kwds)
wrapper to distinguish between arguments passed positionally and by
keyword.  However, I seriously doubt that anyone would need that.


[1] http://docs.python.org/3/library/itertools.html#itertools.repeat
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to