mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
bpo-10544: Deprecate "yield" in comprehensions and generator expressions. (GH-4579)
The current behaviour of yield expressions inside comprehensions and generator expressions is essentially an accident of implementation - it arises implicitly from the way the compiler handles yield expressions inside nested functions and generators. Since the current behaviour wasn't deliberately designed, and is inherently confusing, we're deprecating it, with no current plans to reintroduce it. Instead, our advice will be to use a named nested generator definition for cases where this behaviour is desired.
This commit is contained in:
parent
6a89481680
commit
73a7e9b10b
6 changed files with 134 additions and 20 deletions
|
@ -841,6 +841,41 @@ class GrammarTests(unittest.TestCase):
|
|||
# Check annotation refleak on SyntaxError
|
||||
check_syntax_error(self, "def g(a:(yield)): pass")
|
||||
|
||||
def test_yield_in_comprehensions(self):
|
||||
# Check yield in comprehensions
|
||||
def g(): [x for x in [(yield 1)]]
|
||||
def g(): [x for x in [(yield from ())]]
|
||||
|
||||
def check(code, warntext):
|
||||
with self.assertWarnsRegex(DeprecationWarning, warntext):
|
||||
compile(code, '<test string>', 'exec')
|
||||
import warnings
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('error', category=DeprecationWarning)
|
||||
with self.assertRaisesRegex(SyntaxError, warntext):
|
||||
compile(code, '<test string>', 'exec')
|
||||
|
||||
check("def g(): [(yield x) for x in ()]",
|
||||
"'yield' inside list comprehension")
|
||||
check("def g(): [x for x in () if not (yield x)]",
|
||||
"'yield' inside list comprehension")
|
||||
check("def g(): [y for x in () for y in [(yield x)]]",
|
||||
"'yield' inside list comprehension")
|
||||
check("def g(): {(yield x) for x in ()}",
|
||||
"'yield' inside set comprehension")
|
||||
check("def g(): {(yield x): x for x in ()}",
|
||||
"'yield' inside dict comprehension")
|
||||
check("def g(): {x: (yield x) for x in ()}",
|
||||
"'yield' inside dict comprehension")
|
||||
check("def g(): ((yield x) for x in ())",
|
||||
"'yield' inside generator expression")
|
||||
check("def g(): [(yield from x) for x in ()]",
|
||||
"'yield' inside list comprehension")
|
||||
check("class C: [(yield x) for x in ()]",
|
||||
"'yield' inside list comprehension")
|
||||
check("[(yield x) for x in ()]",
|
||||
"'yield' inside list comprehension")
|
||||
|
||||
def test_raise(self):
|
||||
# 'raise' test [',' test]
|
||||
try: raise RuntimeError('just testing')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue