Why do Python generator functions not have a syntactically different notation from 'regular' functions?

StackOverflow https://stackoverflow.com/questions/20182404

  •  04-08-2022
  •  | 
  •  

Question

I am wondering, after reading about generators in Improve Your Python: 'yield' and Generators Explained, but not having experimented with them yet, why the syntactic notation for a generator function is not different from that of a regular function. The most obvious choice, in my thought experiment, would be:

generator generator_name(param):
    # ...
    yield some_other_value

Instead of:

def generator_name(param):
    # ...
    yield some_value

Now, when one is reading Python code, it seems that one needs to search for the word 'yield' first before understanding that some function is a generator function. Or, is there a Python convention that demands generator functions have a indicative name? like generate_some_value_from_y?

Was it helpful?

Solution

Quoting from PEP 255, the proposal that introduced generators to Python, where Guido van Rossum (the Benevolent Dictator for Life, BDFL) explains why there is no separate keyword:

Issue: Introduce another new keyword (say, gen or generator) in place of def, or otherwise alter the syntax, to distinguish generator-functions from non-generator functions.

Con: In practice (how you think about them), generators are functions, but with the twist that they're resumable. The mechanics of how they're set up is a comparatively minor technical issue, and introducing a new keyword would unhelpfully overemphasize the mechanics of how generators get started (a vital but tiny part of a generator's life).

Pro: In reality (how you think about them), generator-functions are actually factory functions that produce generator-iterators as if by magic. In this respect they're radically different from non-generator functions, acting more like a constructor than a function, so reusing def is at best confusing. A yield statement buried in the body is not enough warning that the semantics are so different.

BDFL: def it stays. No argument on either side is totally convincing, so I have consulted my language designer's intuition. It tells me that the syntax proposed in the PEP is exactly right - not too hot, not too cold. But, like the Oracle at Delphi in Greek mythology, it doesn't tell me why, so I don't have a rebuttal for the arguments against the PEP syntax. The best I can come up with (apart from agreeing with the rebuttals ... already made) is "FUD". If this had been part of the language from day one, I very much doubt it would have made Andrew Kuchling's "Python Warts" page.

In essence, a generator function produces a generator, it is not a generator itself.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top