Author: Philip Jenvey <[email protected]>
Branch: py3.3
Changeset: r72583:8a51205e1709
Date: 2014-07-27 14:06 -0700
http://bitbucket.org/pypy/pypy/changeset/8a51205e1709/
Log: allow generators to return values (part of pep380)
diff --git a/pypy/interpreter/astcompiler/symtable.py
b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -244,18 +244,12 @@
return Scope.note_symbol(self, identifier, role)
def note_yield(self, yield_node):
- if self.return_with_value:
- raise SyntaxError("'return' with argument inside generator",
- self.ret.lineno, self.ret.col_offset)
self.is_generator = True
if self._in_try_body_depth > 0:
self.has_yield_inside_try = True
def note_return(self, ret):
if ret.value:
- if self.is_generator:
- raise SyntaxError("'return' with argument inside generator",
- ret.lineno, ret.col_offset)
self.return_with_value = True
self.ret = ret
diff --git a/pypy/interpreter/astcompiler/test/test_symtable.py
b/pypy/interpreter/astcompiler/test/test_symtable.py
--- a/pypy/interpreter/astcompiler/test/test_symtable.py
+++ b/pypy/interpreter/astcompiler/test/test_symtable.py
@@ -361,8 +361,7 @@
assert exc.msg == "'yield' outside function"
for input in ("yield\n return x", "return x\n yield"):
input = "def f():\n " + input
- exc = py.test.raises(SyntaxError, self.func_scope, input).value
- assert exc.msg == "'return' with argument inside generator"
+ scp = self.func_scope(input)
scp = self.func_scope("def f():\n return\n yield x")
def test_yield_inside_try(self):
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -99,7 +99,7 @@
# if the frame is now marked as finished, it was RETURNed from
if frame.frame_finished_execution:
self.frame = None
- raise OperationError(space.w_StopIteration, space.w_None)
+ raise OperationError(space.w_StopIteration, w_result)
else:
return w_result # YIELDed
finally:
diff --git a/pypy/interpreter/test/test_generator.py
b/pypy/interpreter/test/test_generator.py
--- a/pypy/interpreter/test/test_generator.py
+++ b/pypy/interpreter/test/test_generator.py
@@ -301,6 +301,21 @@
raise StopIteration
assert tuple(f()) == (1,)
+ def test_yield_return(self):
+ """
+ def f():
+ yield 1
+ return 2
+ g = f()
+ assert next(g) == 1
+ try:
+ next(g)
+ except StopIteration as e:
+ assert e.value == 2
+ else:
+ assert False, 'Expected StopIteration'
+ """
+
def test_should_not_inline(space):
from pypy.interpreter.generator import should_not_inline
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit