On Mon, 16 Mar 2015 11:51 pm, Rustom Mody wrote: > It may help to read this 15 year old thread starting > https://mail.python.org/pipermail/python-dev/2001-June/015478.html > to see how many python stalwarts dont like the current state of affairs
/s/dont/didn't/ That's a fifteen year old thread, written before generators were introduced. Guido's intuition has been vindicated -- generators have proven to be a great and powerful feature, and the reuse of "def" for both generator functions and regular functions has turned out to be no more confusing in practice than the use of "def" for both functions and methods[1]. The argument is that generator-producers (def-with-yield) are not like regular functions because calling the def-with-yield doesn't execute the code inside them. Given three objects: def f(): return 1 def g(): yield 1 class C: ... the argument goes that: * Calling f() executes the code inside f. * Calling g() *doesn't* execute the code inside f, but runs some initialisation code and returns an instance; it's the instance that executes the code inside f, using a special method. * Calling C() also doesn't execute the code inside C, but runs some initialisation code and returns an instance. Therefore def-with-yield is closer to a class than a function and should not reuse the same keyword. Or so the argument goes. But this argument doesn't take into account the way generators are used. They are used like functions, not like instances[2] like this: # No instance = gen() instance.fe() instance.fi() instance.fo() instance.fum() but like functions, like this: # Yes for x in gen(): ... sum(gen()) result = map(func, gen()) Here's a pure-Python version of map from Python 2: def map(func, iterable): accum = [] for item in iterable: accum.append(func(item)) return accum Here's the same thing for the Python 3 iterator version: def map(func, iterable): for item in iterable: yield func(item) The similarities when writing these are undeniable. Drop the accumulator, replace any lines that store values into the accumulator with a yield, and drop the final return. The way we write and use generators is closer to the way we write and use functions than classes. If we rule out introducing a new keyword, and insist on picking either "def" or "class", I think it is obvious that "def" is the better choice and "class" would be completely inappropriate. And of course, from a comp science theoretic perspective, generators are a kind of subroutine, not a kind of type. [1] Methods are, of course, actually just functions under the hood. The conversion to MethodType is done at method-lookup time, by the descriptor protocol. [2] I'm aware that they are instances. You know what I mean. -- Steven -- https://mail.python.org/mailman/listinfo/python-list