Skip to content
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

Improve repr() of AST nodes #116022

Closed
JelleZijlstra opened this issue Feb 28, 2024 · 2 comments · Fixed by #117046
Closed

Improve repr() of AST nodes #116022

JelleZijlstra opened this issue Feb 28, 2024 · 2 comments · Fixed by #117046
Labels
stdlib Python modules in the Lib dir topic-parser type-feature A feature request or enhancement

Comments

@JelleZijlstra
Copy link
Member

JelleZijlstra commented Feb 28, 2024

Feature or enhancement

Proposal:

I often use ast.parse in the terminal to explore what the AST looks like:

>>> ast.parse("x = 3")
<ast.Module object at 0x105450b50>

But I have to remember to use ast.dump() to get useful output:

>>> ast.dump(ast.parse("x = 3"))
"Module(body=[Assign(targets=[Name(id='x', ctx=Store())], value=Constant(value=3))], type_ignores=[])"

It would be nice if the default repr() of AST nodes was more like the output of ast.dump(), so it's easier to see at a glance how it works.

One concern would be around the size of the output:

>>> from pathlib import Path
>>> import typing
>>> typing_py = Path(typing.__file__).read_text()
>>> len(ast.dump(ast.parse(typing_py)))
304244

As a middle ground, we could limit the depth of the AST provided in the repr(), e.g. to 2 levels, and also the number of list elements provided.

The repr() of a module's AST might then look something like:

Module(body=[Expr(value=Constant(...)), ..., Assign(targets=[Name(...)], value=Constant(...))], type_ignores=[])

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

@JelleZijlstra JelleZijlstra added type-feature A feature request or enhancement stdlib Python modules in the Lib dir topic-parser labels Feb 28, 2024
@tomasr8
Copy link
Member

tomasr8 commented Mar 10, 2024

This is something that would be useful for me as well since I also sometimes poke around the AST 😄

Were you planning to implement this yourself or do you think I could give it a try? Looking at the code, it'll probably have to be implemented in C since that's where the base AST type is defined.

@JelleZijlstra
Copy link
Member Author

I will do it eventually if no one else gets to it but haven't started yet. You're welcome to start working on it! This might need changes to asdl_c.py which is the Python code that generates the C code for the AST.

JelleZijlstra added a commit that referenced this issue Sep 18, 2024
Co-authored-by: AN Long <[email protected]>
Co-authored-by: Jelle Zijlstra <[email protected]>
Co-authored-by: Alex Waygood <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>
savannahostrowski pushed a commit to savannahostrowski/cpython that referenced this issue Sep 22, 2024
Co-authored-by: AN Long <[email protected]>
Co-authored-by: Jelle Zijlstra <[email protected]>
Co-authored-by: Alex Waygood <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stdlib Python modules in the Lib dir topic-parser type-feature A feature request or enhancement
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants