[Python-checkins] cpython: compiler: don't emit SyntaxWarning on const stmt

victor.stinner python-checkins at python.org
Mon Feb 8 16:47:49 EST 2016


https://hg.python.org/cpython/rev/15531b10976c
changeset:   100202:15531b10976c
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Feb 08 22:45:06 2016 +0100
summary:
  compiler: don't emit SyntaxWarning on const stmt

Issue #26204: the compiler doesn't emit SyntaxWarning warnings anymore when
constant statements are ignored.

files:
  Lib/test/test_ast.py     |   7 +--
  Lib/test/test_code.py    |  58 ++++++++-------------------
  Lib/test/test_grammar.py |   6 +--
  Misc/NEWS                |   7 +-
  Python/compile.c         |  24 +----------
  5 files changed, 27 insertions(+), 75 deletions(-)


diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -3,7 +3,6 @@
 import os
 import sys
 import unittest
-import warnings
 import weakref
 
 from test import support
@@ -240,10 +239,8 @@
                     ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
                     self.assertEqual(to_tuple(ast_tree), o)
                     self._assertTrueorder(ast_tree, (0, 0))
-                with warnings.catch_warnings():
-                    warnings.filterwarnings('ignore', category=SyntaxWarning)
-                    with self.subTest(action="compiling", input=i, kind=kind):
-                        compile(ast_tree, "?", kind)
+                with self.subTest(action="compiling", input=i, kind=kind):
+                    compile(ast_tree, "?", kind)
 
     def test_slice(self):
         slc = ast.parse("x[::]").body[0].value.slice
diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -66,6 +66,24 @@
 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
 ...
@@ -84,10 +102,8 @@
 
 """
 
-import textwrap
 import unittest
 import weakref
-import warnings
 from test.support import run_doctest, run_unittest, cpython_only
 
 
@@ -118,44 +134,6 @@
         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):
 
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -7,7 +7,6 @@
 import sys
 # testing import *
 from sys import *
-from test import support
 
 
 class TokenTests(unittest.TestCase):
@@ -425,11 +424,8 @@
     # Tested below
 
     def test_expr_stmt(self):
-        msg = 'ignore constant statement'
-        with support.check_warnings((msg, SyntaxWarning)):
-            exec("1")
-
         # (exprlist '=')* exprlist
+        1
         1, 2, 3
         x = 1
         x = 1, 2, 3
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,9 +10,10 @@
 Core and Builtins
 -----------------
 
-- Issue #26204: The compiler now ignores constant statements (ex: "def f(): 1")
-  and emit a SyntaxWarning warning. The warning is not emitted for string and
-  ellipsis (...) statements.
+- Issue #26204: The compiler now ignores all constant statements: bytes, str,
+  int, float, complex, name constants (None, False, True), Ellipsis
+  and ast.Constant; not only str and int. For example, ``1.0`` is now ignored
+  in ``def f(): 1.0``.
 
 - Issue #4806: Avoid masking the original TypeError exception when using star
   (*) unpacking in function calls.  Based on patch by Hagen Fürstenau and
diff --git a/Python/compile.c b/Python/compile.c
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2619,33 +2619,13 @@
     switch (value->kind)
     {
     case Str_kind:
+    case Num_kind:
     case Ellipsis_kind:
-        /* Issue #26204: ignore string statement, but don't emit a
-         * SyntaxWarning. Triple quoted strings is a common syntax for
-         * multiline comments.
-         *
-         * Don't emit warning on "def f(): ..." neither. It's a legit syntax
-         * for abstract function. */
-        return 1;
-
     case Bytes_kind:
-    case Num_kind:
     case NameConstant_kind:
     case Constant_kind:
-    {
-        PyObject *msg = PyUnicode_FromString("ignore constant statement");
-        if (msg == NULL)
-            return 0;
-        if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning,
-                                     msg,
-                                     c->c_filename, c->u->u_lineno,
-                                     NULL, NULL) == -1) {
-            Py_DECREF(msg);
-            return 0;
-        }
-        Py_DECREF(msg);
+        /* ignore constant statement */
         return 1;
-    }
 
     default:
         break;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list