(original) (raw)


On Sun, Jan 26, 2014 at 8:52 PM, Nick Coghlan <ncoghlan@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 "", line 1, in
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