]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-118761: Fix star-import of ast (#132025)
authorJelle Zijlstra <jelle.zijlstra@gmail.com>
Wed, 2 Apr 2025 18:15:05 +0000 (11:15 -0700)
committerGitHub <noreply@github.com>
Wed, 2 Apr 2025 18:15:05 +0000 (18:15 +0000)
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Lib/_ast_unparse.py
Lib/ast.py

index c03f9bd4c1d40bdbffdcba0b27bcc681236d74fd..56d9e935dd9d872b6e1e01eb0602564dca82675b 100644 (file)
@@ -6,8 +6,6 @@ from ast import NodeVisitor
 from contextlib import contextmanager, nullcontext
 from enum import IntEnum, auto, _simple_enum
 
-__all__ = ('unparse',)
-
 # Large float and imaginary literals get turned into infinities in the AST.
 # We unparse those infinities to INFSTR.
 _INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
@@ -48,7 +46,7 @@ _SINGLE_QUOTES = ("'", '"')
 _MULTI_QUOTES = ('"""', "'''")
 _ALL_QUOTES = (*_SINGLE_QUOTES, *_MULTI_QUOTES)
 
-class _Unparser(NodeVisitor):
+class Unparser(NodeVisitor):
     """Methods in this class recursively traverse an AST and
     output source code for the abstract syntax; original formatting
     is disregarded."""
@@ -1142,9 +1140,3 @@ class _Unparser(NodeVisitor):
         with self.require_parens(_Precedence.BOR, node):
             self.set_precedence(_Precedence.BOR.next(), *node.patterns)
             self.interleave(lambda: self.write(" | "), self.traverse, node.patterns)
-
-
-def unparse(ast_obj):
-    unparser = _Unparser()
-    return unparser.visit(ast_obj)
-unparse.__module__ = 'ast'  # backwards compatibility
index 8be4f68455150a004147c297a2e04dc265158c9e..507fec5f2d38900d4a067205ee1050f4eb9a88f0 100644 (file)
@@ -24,7 +24,6 @@
     :copyright: Copyright 2008 by Armin Ronacher.
     :license: Python License.
 """
-import sys
 from _ast import *
 
 
@@ -621,8 +620,19 @@ class Param(expr_context):
     """Deprecated AST node class.  Unused in Python 3."""
 
 
+def unparse(ast_obj):
+    global _Unparser
+    try:
+        unparser = _Unparser()
+    except NameError:
+        from _ast_unparse import Unparser as _Unparser
+        unparser = _Unparser()
+    return unparser.visit(ast_obj)
+
+
 def main():
     import argparse
+    import sys
 
     parser = argparse.ArgumentParser()
     parser.add_argument('infile', nargs='?', default='-',
@@ -651,15 +661,3 @@ def main():
 
 if __name__ == '__main__':
     main()
-
-def __dir__():
-    dir_ = {n for n in globals() if not n.startswith('_') and n != 'sys'}
-    return sorted(dir_ | {'unparse'})
-
-def __getattr__(name):
-    if name == 'unparse':
-        global unparse
-        from _ast_unparse import unparse
-        return unparse
-
-    raise AttributeError(f'module {__name__!r} has no attribute {name!r}')