[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
- Previous message: [Python-Dev] cpython: Issue 19944: Fix importlib.find_spec() so it imports parents as needed.
- Next message: [Python-Dev] Negative times behaviour in itertools.repeat for Python maintenance releases (2.7, 3.3 and maybe 3.4)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: [Python-Dev] cpython: Issue 19944: Fix importlib.find_spec() so it imports parents as needed.
- Next message: [Python-Dev] Negative times behaviour in itertools.repeat for Python maintenance releases (2.7, 3.3 and maybe 3.4)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]