[Python-Dev] Tricky way of of creating a generator via a comprehension expression

2017年11月22日 05:06:40 -0800

From https://stackoverflow.com/questions/45190729/differences-between-generator-comprehension-expressions.
 g = [(yield i) for i in range(3)]
Syntactically this looks like a list comprehension, and g should be a list, right? But actually it is a generator. This code is equivalent to the following code:
 def _make_list(it):
 result = []
 for i in it:
 result.append(yield i)
 return result
 g = _make_list(iter(range(3)))
Due to "yield" in the expression _make_list() is not a function returning a list, but a generator function returning a generator. This change in semantic looks unintentional to me. It looks like leaking an implementation detail. If a list comprehension would be implemented not via creating and calling an intermediate function, but via an inlined loop (like in Python 2) this would be a syntax error if used outside of a function or would make an outer function a generator function.
 __result = []
 __i = None
 try:
 for __i in range(3):
 __result.append(yield __i)
 g = __result
 finally:
 del __result, __i
I don't see how the current behavior can be useful.
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to