Hi Joshua,

First of all, thanks for working on this! I quickly looked over the PR and it looks ready to be merged, great work.

I've been oscillating between wanting to have aiter/anext as builtins and putting them into the operators module for quite a while. On the one hand asynchronous iteration is a niche thing compared to regular iteration, on the other, 'async for' and asynchronous generators are language constructs. Overall, I'm leaning towards having them as builtins. That would make them more discoverable and slightly more convenient to use with things like 'aclosing', especially if the code is following the "import only modules" convention. And in my opinion there's almost no overhead with regards to how big is the list of builtins (especially with the globals opcode cache).

So my personal vote would be to make them builtins and merge your PR as is.

Yury


On Fri, Mar 19, 2021 at 3:18 PM Joshua Bronson <jabronson@gmail.com> wrote:
Thanks for all the feedback so far (and for the kind words, Guido! 😊).

Discussion here so far is converging on resurrecting my original PR from 2018 adding these to operator. Anyone else we should hear from before considering the more recent PR not worth pursuing for now? Would be good to hear from Yury given his previous feedback, but seems like he’s been too busy to respond. Should we wait (for some limited amount of time, in light of the upcoming 3.10 feature freeze?) for more feedback?

I’m ready to update whichever PR we’re going ahead with, once I know which one that is.

Thanks,
Josh


On Fri, Mar 19, 2021 at 17:23 Brett Cannon <brett@python.org> wrote:
I personally would be okay with aiter() (with the modern API 😉) and next() in the `operator` module. There's already precedent in having things there that are rarely used directly but still implement the use of a special method, e.g. operator.index() (https://docs.python.org/3/library/operator.html#operator.index).

On Fri, Mar 19, 2021 at 10:29 AM Guido van Rossum <guido@python.org> wrote:
I assume that one of the concerns is that these functions are trivial. aiter(x) is just x.__aiter__(), and anext(it) is just it.__next__(). I’m not convinced that we need aiter(x, sentinel) at all — for iter() it’s mostly a legacy compatibility API.

If you use these a lot it’s simple enough to add one-liners to the top of your module or to your project’s utilities.

I also feel (but I may be alone in this) that maybe we went overboard with the design of async for (and async with).

That said the work itself is impeccable. While you’re waiting for a resolution you may want to try working on other contributions!

—Guido

On Fri, Mar 19, 2021 at 09:59 Luciano Ramalho <luciano@ramalho.org> wrote:
OK, but it seems clear to me that if there are any lingering doubts it would be better to add the functions to a module than to the built-ins, and later promote them to built-ins if people actually find them widely useful.

On the other hand, adding something to built-ins that turns out to be rarely useful adds unnecessary noise and is much harder to fix later without causing further problems.

Best,

Luciano


On Fri, Mar 19, 2021 at 1:22 PM Joshua Bronson <jabronson@gmail.com> wrote:
Thanks for taking a look at this, Luciano.

Yury immediately replied to the comment from Jelle that you quoted with the following:

> Do these really need to be builtins?

We're only beginning to see async iterators being used in the wild, so we can't have a definitive answer at this point.

> They seem too specialized to be widely useful; I've personally never needed them in any async code I've written. It would make more sense to me to put them in a module like operators.

I think putting them to the operators module makes sense, at least for 3.8.  Do you want to work on a pull request?


That was on 2018-06-14. On 2018-08-24, I submitted https://github.com/python/cpython/pull/8895, "Add operator.aiter and operator.anext". On 2018-09-07, Yury left the following comment on that PR:

Please don't merge this yet. I'm not convinced that aiter and anext shouldn't be builtins.


So there has been some back-and-forth on this, and some more years have passed, but all the latest signals we've gotten up to now have indicated a preference for adding these to builtins.

In any case, as of my latest PR, the Python core developers now have both options to choose from.

As community contributors, is there anything further we can do to help drive timely resolution on this one way or another?

Thanks,
Josh


On Fri, Mar 19, 2021 at 11:29 AM Luciano Ramalho <luciano@ramalho.org> wrote:
Thanks for working on this, Joshua. I agree 100% with Jelle Zijlstra in the issue tracker:

Do these really need to be builtins?

They seem too specialized to be widely useful; I've personally never needed them in any async code I've written. It would make more sense to me to put them in a module like operators.

(sorry for the weird formatting, posting from an iPad)

On Wed, Mar 17, 2021 at 21:01 Joshua Bronson <jabronson@gmail.com> wrote:
Dear python-dev,

New here (but not to Python). 👋 Brett Cannon recommended I start a thread here (thanks, Brett!).

In December, two colleagues and I submitted https://github.com/python/cpython/pull/23847, "Add aiter and anext to builtins", which would fix https://bugs.python.org/issue31861.

Would any core developers who may be reading this be willing and able to provide a code review?

We would love to try to address any review feedback before having to fix (another round of) merge conflicts. (And ideally maybe even get this landed in time for the 3.10 feature freeze in early May?)

Thanks and hope this finds you well.
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/5XUVPB5H4PFUGTC5F7KAN4STKAEOFBQM/
Code of Conduct: http://python.org/psf/codeofconduct/
--
Luciano Ramalho
|  Author of Fluent Python (O'Reilly, 2015)
|     http://shop.oreilly.com/product/0636920032519.do
|  Technical Principal at ThoughtWorks
|  Twitter: @ramalhoorg


--
Luciano Ramalho
|  Author of Fluent Python (O'Reilly, 2015)
|     http://shop.oreilly.com/product/0636920032519.do
|  Technical Principal at ThoughtWorks
|  Twitter: @ramalhoorg
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/R3I7WIXNZNVA534XFABDQJRHHKRB6X2S/
Code of Conduct: http://python.org/psf/codeofconduct/
--
--Guido (mobile)
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/MOE5OKHMHS6BU2PSTOLHC73LW2A3JHKF/
Code of Conduct: http://python.org/psf/codeofconduct/


--
         Yury