On 22/08/18 14:38, Jonathan Fine wrote:
Hi Rhodri
You wrote:
This, by the way, is why think using the same syntax for function definition and
generator definition was a mistake. It's only when I reach a "yield" statement
that I realise my expectations for this code are wrong.
Here's something that might help, and surprise, you. This has been
present since Python 2.5.
If by "help" you mean "make even more confused", then yes. Surprise is
a given with generators, as I said.
def fn():
... if None:
... yield
...
list(fn()) # Fails, unless fn is a generator function.
[]
I think what's happening is this. Even though the None-guarded yield
has been optimised away, it leaves a residue. Namely, that there's a
yield in the function. Hence fn() is an iterator.
Having explained the surprise, here's how it can help you. Suppose you
have a long function body, with a single yield at the bottom. If you
write like this:
def my_very_long_function_with_one_yield_point(...):
if None: yield # This is a generator function.
then the next programmer can know immediately that it's a generator function.
Ew.
I'd prefer this way of doing it:
def my_very_long_function_with_one_yield_point(...):
# This is a generator
--
Rhodri James *-* Kynesim Ltd
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/