diff options
author | Victor Stinner <vstinner@python.org> | 2020-09-15 16:03:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-15 16:03:34 (GMT) |
commit | e5fbe0cbd4be99ced5f000ad382208ad2a561c90 (patch) | |
tree | ef90c11a7bd87eee4623b061047edb1211dce422 /Lib/ast.py | |
parent | 7bcc6456ad4704da9b287c8045768fa53961adc5 (diff) | |
download | cpython-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.py | 37 |
1 files changed, 22 insertions, 15 deletions
@@ -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.""" |