[Python-Dev] Negative times behaviour in itertools.repeat for Python maintenance releases (2.7, 3.3 and maybe 3.4) (original) (raw)

Vajrasky Kok sky.kok at speaklikeaking.com
Sun Jan 26 18:00:19 CET 2014


Dear comrades,

I would like to bring to your attention my disagreement with Larry Hastings in this ticket: http://bugs.python.org/issue19145 (Inconsistent behaviour in itertools.repeat when using negative times).

Let me give you the context:

from itertools import repeat repeat('a') repeat('a') repeat('a', times=-1) repeat('a') repeat('a', -1) repeat('a', 0) repeat('a', times=-4) repeat('a', -4) repeat('a', -4) repeat('a', 0)

Right now, the only way you can tell repeat to do endless repetitions is to omit the times argument or by setting times argument to -1 via keyword.

Larry intends to fix this in Python 3.5 by making None value to times argument as a representative of unlimited repetitions and negative times argument (either via keyword or positional) ALWAYS means 0 repetitions. This will ensure repeat has the appropriate signature. I have no qualms about it. All is well.

My disagreement is related to Larry's decision not to fix this bug in Python 2.7, 3.3, and 3.4. Both of us agree that we should not let Python 2.7, 3.3, and 3.4 happily accepts None value because that is more than bug fix. What we don't agree is whether we should make negative times argument via keyword behaviour needs to be changed or not. He prefer let it be. I prefer we change the behaviour so that negative times argument in Python 2.7, 3.3, and 3.4 ALWAYS means 0 repetitions.

My argument is that, on all circumstances, argument sent to function via positional or keyword must mean the same thing.

Let's consider this hypothetical code:

0 means draw, positive int means win, negative int means lose

result = goals_result_of_the_match()

For every goal of the winning match, we donate money to charity.

Every donation consists of 10 $.

import itertools itertools.repeat(donate_money_to_charity(), result)

Later programmer B refactor this code:

0 means draw, positive int means win, negative int means lose

result = goals_result_of_the_match()

For every goal of the winning match, we donate money to charity.

Every donation consists of 10 $

from itertools import repeat repeat(object=donate_money_to_charity(), times=result)

They use Python 2.7 (remember Python 2.7 is here to stay for a long long time). And imagine the match is lost 0-1 or 1-2 or 2-3 (so the goal difference is negative one / -1). It means they donate money to charity endlessly!!! They can go bankrupt.

So I hope my argument is convincing enough. We need to fix this bug in Python 2.7, 3.3, and 3.4, by making times argument sent via positional or keyword in itertools.repeat ALWAYS means the same thing, which is 0 repetitions.

If this is not possible, at the very least, we need to warn this behaviour in the doc.

Whatever decision that comes up from this discussion, I will make peace with it.

Vajrasky



More information about the Python-Dev mailing list