Browse Source

bpo-40807: Show warnings once from codeop._maybe_compile (#20486)

* bpo-40807: Show warnings once from codeop._maybe_compile

* Move catch_warnings

* news

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
pull/20643/head
Cheryl Sabella 6 years ago
committed by GitHub
parent
commit
052d3fc090
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      Lib/codeop.py
  2. 5
      Lib/test/test_codeop.py
  3. 2
      Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst

22
Lib/codeop.py

@ -57,6 +57,7 @@ Compile():
"""
import __future__
import warnings
_features = [getattr(__future__, fname)
for fname in __future__.all_feature_names]
@ -83,15 +84,18 @@ def _maybe_compile(compiler, source, filename, symbol):
except SyntaxError:
pass
try:
code1 = compiler(source + "\n", filename, symbol)
except SyntaxError as e:
err1 = e
try:
code2 = compiler(source + "\n\n", filename, symbol)
except SyntaxError as e:
err2 = e
# Suppress warnings after the first compile to avoid duplication.
with warnings.catch_warnings():
warnings.simplefilter("ignore")
try:
code1 = compiler(source + "\n", filename, symbol)
except SyntaxError as e:
err1 = e
try:
code2 = compiler(source + "\n\n", filename, symbol)
except SyntaxError as e:
err2 = e
try:
if code:

5
Lib/test/test_codeop.py

@ -303,6 +303,11 @@ class CodeopTests(unittest.TestCase):
self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename,
compile("a = 1\n", "def", 'single').co_filename)
def test_warning(self):
# Test that the warning is only returned once.
with support.check_warnings((".*literal", SyntaxWarning)) as w:
compile_command("0 is 0")
self.assertEqual(len(w.warnings), 1)
if __name__ == "__main__":
unittest.main()

2
Misc/NEWS.d/next/Library/2020-06-04-16-25-15.bpo-40807.yYyLWx.rst

@ -0,0 +1,2 @@
Stop codeop._maybe_compile, used by code.InteractiveInterpreter (and IDLE).
from from emitting each warning three times.
Loading…
Cancel
Save