diff options
| author | Yury Selivanov <yselivanov@sprymix.com> | 2015-05-22 11:16:47 -0400 |
|---|---|---|
| committer | Yury Selivanov <yselivanov@sprymix.com> | 2015-05-22 11:16:47 -0400 |
| commit | 683333955a05a31da5f0b2ca1b3bffb9962fb4b2 (patch) | |
| tree | 236016d773133c19e57c14fc69144e46a586549d /Lib/test/test_generators.py | |
| parent | e79ec70801e410de9c3110ffe78f98e08114ae16 (diff) | |
| download | cpython-git-683333955a05a31da5f0b2ca1b3bffb9962fb4b2.tar.gz | |
Issue 24237: Raise PendingDeprecationWarning per PEP 479
Raise PendingDeprecationWarning when generator raises StopIteration
and no __future__ import is used. Fix offenders in the stdlib
and tests.
See also issue 22906.
Thanks to Nick Coghlan and Berker Peksag for reviews.
Diffstat (limited to 'Lib/test/test_generators.py')
| -rw-r--r-- | Lib/test/test_generators.py | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 85e09a1f57..fe4b138c37 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -1,6 +1,7 @@ import gc import sys import unittest +import warnings import weakref from test import support @@ -217,6 +218,46 @@ class ExceptionTest(unittest.TestCase): self.assertEqual(next(g), "done") self.assertEqual(sys.exc_info(), (None, None, None)) + def test_stopiteration_warning(self): + # See also PEP 479. + + def gen(): + raise StopIteration + yield + + with self.assertRaises(StopIteration), \ + self.assertWarnsRegex(PendingDeprecationWarning, "StopIteration"): + + next(gen()) + + with self.assertRaisesRegex(PendingDeprecationWarning, + "generator .* raised StopIteration"), \ + warnings.catch_warnings(): + + warnings.simplefilter('error') + next(gen()) + + + def test_tutorial_stopiteration(self): + # Raise StopIteration" stops the generator too: + + def f(): + yield 1 + raise StopIteration + yield 2 # never reached + + g = f() + self.assertEqual(next(g), 1) + + with self.assertWarnsRegex(PendingDeprecationWarning, "StopIteration"): + with self.assertRaises(StopIteration): + next(g) + + with self.assertRaises(StopIteration): + # This time StopIteration isn't raised from the generator's body, + # hence no warning. + next(g) + tutorial_tests = """ Let's try a simple generator: @@ -263,26 +304,7 @@ Let's try a simple generator: File "<stdin>", line 1, in ? StopIteration -"raise StopIteration" stops the generator too: - - >>> def f(): - ... yield 1 - ... raise StopIteration - ... yield 2 # never reached - ... - >>> g = f() - >>> next(g) - 1 - >>> next(g) - Traceback (most recent call last): - File "<stdin>", line 1, in ? - StopIteration - >>> next(g) - Traceback (most recent call last): - File "<stdin>", line 1, in ? - StopIteration - -However, they are not exactly equivalent: +However, "return" and StopIteration are not exactly equivalent: >>> def g1(): ... try: |
