summaryrefslogtreecommitdiffstats
path: root/Lib/ast.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-09-15 16:03:34 (GMT)
committerGitHub <noreply@github.com>2020-09-15 16:03:34 (GMT)
commite5fbe0cbd4be99ced5f000ad382208ad2a561c90 (patch)
treeef90c11a7bd87eee4623b061047edb1211dce422 /Lib/ast.py
parent7bcc6456ad4704da9b287c8045768fa53961adc5 (diff)
downloadcpython-e5fbe0cbd4be99ced5f000ad382208ad2a561c90.zip
cpython-e5fbe0cbd4be99ced5f000ad382208ad2a561c90.tar.gz
cpython-e5fbe0cbd4be99ced5f000ad382208ad2a561c90.tar.bz2
bpo-41631: _ast module uses again a global state (#21961)
Partially revert commit ac46eb4ad6662cf6d771b20d8963658b2186c48c: "bpo-38113: Update the Python-ast.c generator to PEP384 (gh-15957)". Using a module state per module instance is causing subtle practical problems. For example, the Mercurial project replaces the __import__() function to implement lazy import, whereas Python expected that "import _ast" always return a fully initialized _ast module. Add _PyAST_Fini() to clear the state at exit. The _ast module has no state (set _astmodule.m_size to 0). Remove astmodule_traverse(), astmodule_clear() and astmodule_free() functions.
Diffstat (limited to 'Lib/ast.py')
-rw-r--r--Lib/ast.py37
1 files changed, 22 insertions, 15 deletions
diff --git a/Lib/ast.py b/Lib/ast.py
index 65ebd01..d860917 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -497,18 +497,20 @@ class NodeTransformer(NodeVisitor):
return node
-# The following code is for backward compatibility.
-# It will be removed in future.
+# If the ast module is loaded more than once, only add deprecated methods once
+if not hasattr(Constant, 'n'):
+ # The following code is for backward compatibility.
+ # It will be removed in future.
-def _getter(self):
- """Deprecated. Use value instead."""
- return self.value
+ def _getter(self):
+ """Deprecated. Use value instead."""
+ return self.value
-def _setter(self, value):
- self.value = value
+ def _setter(self, value):
+ self.value = value
-Constant.n = property(_getter, _setter)
-Constant.s = property(_getter, _setter)
+ Constant.n = property(_getter, _setter)
+ Constant.s = property(_getter, _setter)
class _ABC(type):
@@ -600,14 +602,19 @@ class ExtSlice(slice):
def __new__(cls, dims=(), **kwargs):
return Tuple(list(dims), Load(), **kwargs)
-def _dims_getter(self):
- """Deprecated. Use elts instead."""
- return self.elts
+# If the ast module is loaded more than once, only add deprecated methods once
+if not hasattr(Tuple, 'dims'):
+ # The following code is for backward compatibility.
+ # It will be removed in future.
-def _dims_setter(self, value):
- self.elts = value
+ def _dims_getter(self):
+ """Deprecated. Use elts instead."""
+ return self.elts
-Tuple.dims = property(_dims_getter, _dims_setter)
+ def _dims_setter(self, value):
+ self.elts = value
+
+ Tuple.dims = property(_dims_getter, _dims_setter)
class Suite(mod):
"""Deprecated AST node class. Unused in Python 3."""