New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add un-parse function to ast #68190
Comments
Twice recently I've wanted a function that transforms an AST node tree back into text:
Both times I did a half-assed job just to get the patch working, so we could decide whether or not we want to go this route. It seems useful and reasonable to do a proper job and add this functionality to ast. |
Perhaps a NodeVisitor subclass (something like Armin Ronacher's codegen module https://github.com/berkerpeksag/astor/blob/master/astor/codegen.py#L54 can be added to the ast module. |
Good idea, I'll go ahead and borrow Guido's time machine. https://docs.python.org/3/library/ast.html#ast.NodeVisitor However, NodeVisitor does not transform the ast tree back into text. So in what way is this helpful? Also, for what it's worth: both my use cases only need to handle expressions ("r-values" if you prefer). I don't need to generate classes, functions, blocks, or even statements. If we wanted to weaken the implementation to only handle expressions I'd be happy. (In fact, I'd be happier this way, because it means the implementation would be much simpler!) |
For bpo-24001 you need rather eval(ast). But a function for stringifying ast would be useful in any case. |
Actually eval(ast) is all I need for bpo-23967 too. But eval is a builtin, so it feels wrong to have it supporting--and therefore dependent on--ast. |
I think there is standard way to transform ast to bytecode and evaluate it. |
There is! compile() will do it, though the docstring doesn't mention it. (The full documentation does.) The following function meets both my use cases: def eval_ast_expr(node, symbols=None, *, filename='-'):
"""
Takes an ast.Expr node. Compiles and evaluates it.
Returns the result of the expression.
if not isinstance(node, ast.Expr):
raise RuntimeError(
"eval_ast_expr: node must be of type ast.Expr")
if symbols == None:
symbols = globals()
a = ast.Expression(node.value)
co = compile(a, filename, 'eval')
fn = types.FunctionType(co, symbols)
return fn() I am therefore closing this bug. It still seems like a nice-to-have but I'll let somebody else do it when *they* have a use case. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: