gh-104770: Let generator.close() return value (#104771)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
This commit is contained in:
Nicolas Tessore 2023-05-23 21:51:56 +01:00 committed by GitHub
parent 50fce89d12
commit d56c933992
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 105 additions and 9 deletions

View file

@ -451,6 +451,88 @@ class ExceptionTest(unittest.TestCase):
self.assertEqual(cm.exception.value.value, 2)
class GeneratorCloseTest(unittest.TestCase):
def test_close_no_return_value(self):
def f():
yield
gen = f()
gen.send(None)
self.assertIsNone(gen.close())
def test_close_return_value(self):
def f():
try:
yield
# close() raises GeneratorExit here, which is caught
except GeneratorExit:
return 0
gen = f()
gen.send(None)
self.assertEqual(gen.close(), 0)
def test_close_not_catching_exit(self):
def f():
yield
# close() raises GeneratorExit here, which isn't caught and
# therefore propagates -- no return value
return 0
gen = f()
gen.send(None)
self.assertIsNone(gen.close())
def test_close_not_started(self):
def f():
try:
yield
except GeneratorExit:
return 0
gen = f()
self.assertIsNone(gen.close())
def test_close_exhausted(self):
def f():
try:
yield
except GeneratorExit:
return 0
gen = f()
next(gen)
with self.assertRaises(StopIteration):
next(gen)
self.assertIsNone(gen.close())
def test_close_closed(self):
def f():
try:
yield
except GeneratorExit:
return 0
gen = f()
gen.send(None)
self.assertEqual(gen.close(), 0)
self.assertIsNone(gen.close())
def test_close_raises(self):
def f():
try:
yield
except GeneratorExit:
pass
raise RuntimeError
gen = f()
gen.send(None)
with self.assertRaises(RuntimeError):
gen.close()
class GeneratorThrowTest(unittest.TestCase):
def test_exception_context_with_yield(self):