summaryrefslogtreecommitdiff
path: root/Lib/test/test_code.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-02-08 18:17:58 +0100
committerVictor Stinner <victor.stinner@gmail.com>2016-02-08 18:17:58 +0100
commita2724095cd55d75497d9cd48d35911599f4dedda (patch)
tree3d140ea269727f28190631a02a1cd9c6b5219ec6 /Lib/test/test_code.py
parent51d8c526d5634fa1f0e4976fd357c5423a792082 (diff)
downloadcpython-git-a2724095cd55d75497d9cd48d35911599f4dedda.tar.gz
compiler now ignores constant statements
The compile ignores constant statements and emit a SyntaxWarning warning. Don't emit the warning for string statement because triple quoted string is a common syntax for multiline comments. Don't emit the warning on ellipis neither: 'def f(): ...' is a legit syntax for abstract functions. Changes: * test_ast: ignore SyntaxWarning when compiling test statements. Modify test_load_const() to use assignment expressions rather than constant expression. * test_code: add more kinds of constant statements, ignore SyntaxWarning when testing that the compiler removes constant statements. * test_grammar: ignore SyntaxWarning on the statement "1"
Diffstat (limited to 'Lib/test/test_code.py')
-rw-r--r--Lib/test/test_code.py58
1 files changed, 40 insertions, 18 deletions
diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
index 21b12a56e4..2cf088ce3c 100644
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -66,24 +66,6 @@ nlocals: 1
flags: 67
consts: ('None',)
->>> def optimize_away():
-... 'doc string'
-... 'not a docstring'
-... 53
-... 0x53
-
->>> dump(optimize_away.__code__)
-name: optimize_away
-argcount: 0
-kwonlyargcount: 0
-names: ()
-varnames: ()
-cellvars: ()
-freevars: ()
-nlocals: 0
-flags: 67
-consts: ("'doc string'", 'None')
-
>>> def keywordonly_args(a,b,*,k1):
... return a,b,k1
...
@@ -102,8 +84,10 @@ consts: ('None',)
"""
+import textwrap
import unittest
import weakref
+import warnings
from test.support import run_doctest, run_unittest, cpython_only
@@ -134,6 +118,44 @@ class CodeTest(unittest.TestCase):
self.assertEqual(co.co_name, "funcname")
self.assertEqual(co.co_firstlineno, 15)
+ def dump(self, co):
+ dump = {}
+ for attr in ["name", "argcount", "kwonlyargcount", "names", "varnames",
+ "cellvars", "freevars", "nlocals", "flags"]:
+ dump[attr] = getattr(co, "co_" + attr)
+ dump['consts'] = tuple(consts(co.co_consts))
+ return dump
+
+ def test_optimize_away(self):
+ ns = {}
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
+ exec(textwrap.dedent('''
+ def optimize_away():
+ 'doc string'
+ 'not a docstring'
+ 53
+ 0x53
+ b'bytes'
+ 1.0
+ True
+ False
+ None
+ ...
+ '''), ns)
+
+ self.assertEqual(self.dump(ns['optimize_away'].__code__),
+ {'name': 'optimize_away',
+ 'argcount': 0,
+ 'kwonlyargcount': 0,
+ 'names': (),
+ 'varnames': (),
+ 'cellvars': (),
+ 'freevars': (),
+ 'nlocals': 0,
+ 'flags': 67,
+ 'consts': ("'doc string'", 'None')})
+
class CodeWeakRefTest(unittest.TestCase):