From 06822bfbf625e9777813542be0b8a2d10a685f30 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 2 Apr 2025 11:15:05 -0700 Subject: gh-118761: Fix star-import of ast (#132025) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Lib/_ast_unparse.py | 10 +--------- Lib/ast.py | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/Lib/_ast_unparse.py b/Lib/_ast_unparse.py index c03f9bd..56d9e93 100644 --- a/Lib/_ast_unparse.py +++ b/Lib/_ast_unparse.py @@ -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 diff --git a/Lib/ast.py b/Lib/ast.py index 8be4f68..507fec5 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -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}') -- cgit v0.12