-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
gh-135282: change documented signature of itertools.accumulate()
#135283
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
gh-135282: change documented signature of itertools.accumulate()
#135283
Conversation
Now it's in sync with docstring/inspect output.
@rhettinger, I know you usually against changes in docs, that introduce "advanced" function signatures (despite PDEB decision), but I think this change worth it.
BTW, most examples in the module (except for islice/repeat) use AC and could be easily converted to use signatures as in the sphinx docs (i.e., no slashes). |
itertools.accumulate()
@@ -93,12 +93,12 @@ streams of infinite length, so they should only be accessed by functions or | |||
loops that truncate the stream. | |||
|
|||
|
|||
.. function:: accumulate(iterable[, function, *, initial=None]) | |||
.. function:: accumulate(iterable, func=None, *, initial=None) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is a better alternative, if we decide to change anything. None
is misleading: the prose notes that the function defaults to addition. This is a good example of the function de facto having multiple signatures. The simple case is summation, the intermediate case is summation from an initial condition, and the advanced case is a custom accumulator.
The linked issue is a user using keyword-arguments for both iterable and func, which should probably be discouraged. I personally find it clearer to have 'function' throughout in the prose documentation, and I wonder if func is less clear to non-native speakers of English.
.. function:: accumulate(iterable, func=None, *, initial=None) | |
.. function:: accumulate(iterable) | |
accumulate(iterable, *, initial) | |
accumulate(iterable, func, *, initial=None) |
Arguably, it should note that initial is only used if not None
, too, but this is somewhat obvious from context.
A second, simpler suggestion would be as follows:
.. function:: accumulate(iterable, func=None, *, initial=None) | |
.. function:: accumulate(iterable, *, initial=None) | |
accumulate(iterable, func, *, initial=None) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a good example of the function de facto having multiple signatures.
Yet it has one.
The linked issue is a user using keyword-arguments for both iterable and func, which should probably be discouraged.
Both argument names are part of the API.
I personally find it clearer to have 'function' throughout in the prose documentation
We can change argument name, but it looks as a compatibility break for me.
Sorry, neither suggestion is acceptable for me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.. function:: accumulate(iterable, *, initial=None)
accumulate(iterable, func, *, initial=None)
This suggestion is IMO the best because it hides the implementation detail of func=None
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"reference material should prioritize precision and completeness" (c)
Proposed changes aren't precise. Are you suggesting to change actual function signature?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, I meant to hide the implementation detail. I don't think anyone is expected to do accumulate(iterable, None)
(the current docs do not expose that detail for instance).
Even if the EB's decision is about "reference material should prioritize precision and completeness", it's a "SHOULD" not a "MUST", which I consider it as a recommendation and not a strict rule. When it comes at the cost of exposing implementation details, I think it's better not to.
Now, itertools.groupby explicitly documents key
as being allowed to be None
and says:
If not specified or is None, key defaults to an identity function and returns the element unchanged
So, if you want to keep func=None
, I'd suggest stating that None
defaults to addition. This would avoid two signatures in the docs and would be aligned with itertools.groupby
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
which I consider it as a recommendation and not a strict rule
Given the fate of #131885 - I guess you are right :(
When it comes at the cost of exposing implementation details, I think it's better not to.
Where is the difference between implementation details and API? These "details" could be discovered anyway by standard tools for introspection.
Now function has a valid (for the inspect module) signature. Why should we lie in docs, that func=None is not accepted?
I'd suggest stating that None defaults to addition.
But that seems to be documented: "The func defaults to addition." (and default argument for func shown in the signature)
Doc/library/itertools.rst
Outdated
|
||
Make an iterator that returns accumulated sums or accumulated | ||
results from other binary functions. | ||
|
||
The *function* defaults to addition. The *function* should accept | ||
The *func* defaults to addition. The *func* should accept |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't change this to func
. I have intentionally spelled-out function
in multiple places in the itertools docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I reverted this and other examples in the function description. (Not sure if this is a good idea: *function*
clearly refers to the argument name.)
I also modified example per suggestion in the issue thread.
Now it's in sync with docstring/inspect output.
function
argument ofitertools.accumulate()
gets error against the doc #135282📚 Documentation preview 📚: https://cpython-previews--135283.org.readthedocs.build/
https://cpython-previews--135283.org.readthedocs.build/en/135283/library/itertools.html#itertools.accumulate