Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

skirpichev
Copy link
Contributor

@skirpichev skirpichev commented Jun 9, 2025

Now it's in sync with docstring/inspect output.
@skirpichev
Copy link
Contributor Author

@rhettinger, I know you usually against changes in docs, that introduce "advanced" function signatures (despite PDEB decision), but I think this change worth it.

  1. This function has single signature, supported by inspect/help().
  2. Old signature syntax is not explained anywhere in docs.
  3. It also has '*' symbol to guess it's meaning, but in the new version it has tooltip to provide some hints about.

Before:
Screenshot from 2025-06-09 10-47-37
After:
Screenshot from 2025-06-09 10-48-05

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).

@AA-Turner AA-Turner changed the title gh-135282: correct itertools.accumulate() signature in sphinx docs gh-135282: change documented signature of itertools.accumulate() Jun 9, 2025
@@ -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)
Copy link
Member

@AA-Turner AA-Turner Jun 9, 2025

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.

Suggested change
.. 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:

Suggested change
.. function:: accumulate(iterable, func=None, *, initial=None)
.. function:: accumulate(iterable, *, initial=None)
accumulate(iterable, func, *, initial=None)

Copy link
Contributor Author

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.

Copy link
Member

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.

Copy link
Contributor Author

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?

Copy link
Member

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.

Copy link
Contributor Author

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)


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
Copy link
Contributor

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.

Copy link
Contributor Author

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.

@rhettinger rhettinger self-assigned this Jun 16, 2025
@rhettinger rhettinger closed this Jun 16, 2025
@skirpichev skirpichev deleted the fix-accumulate-signature/135282 branch June 17, 2025 01:15
@skirpichev skirpichev restored the fix-accumulate-signature/135282 branch June 21, 2025 12:53
@skirpichev skirpichev reopened this Jun 21, 2025
@skirpichev skirpichev marked this pull request as draft June 21, 2025 12:54
@skirpichev skirpichev marked this pull request as ready for review June 21, 2025 13:04
@skirpichev skirpichev requested a review from rhettinger June 21, 2025 13:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
awaiting review docs Documentation in the Doc dir needs backport to 3.13 bugs and security fixes needs backport to 3.14 bugs and security fixes skip news
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

4 participants