[New-bugs-announce] [issue37995] Multiline ast.dump()
Serhiy Storchaka
report at bugs.python.org
Sat Aug 31 05:29:28 EDT 2019
New submission from Serhiy Storchaka <storchaka+cpython at gmail.com>:
ast.dump() is mainly useful for debugging purposes. Unfortunately the output is too long and complex even for simple examples. It contains too much nested calls and lists.
>>> import ast
>>> node = ast.parse('spam(eggs, "and cheese")')
>>> print(ast.dump(node))
Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], keywords=[]))], type_ignores=[])
It is worse if include more information:
>>> print(ast.dump(node, include_attributes=True))
Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])
And for larger examples it is almost unusable.
I propose to make ast.dump() producing a multiline indented output. Add the optional "indent" parameter. If it is a non-negative number or a string, the output if formatted with the specified indentation. If it is None (by default), the output is a single string.
>>> print(ast.dump(node, indent=3))
Module(
body=[
Expr(
value=Call(
func=Name(
id='spam',
ctx=Load()),
args=[
Name(
id='eggs',
ctx=Load()),
Constant(
value='and cheese',
kind=None)],
keywords=[]))],
type_ignores=[])
Looks better, no?
I am not sure about closing parenthesis. Should they be attached to the last item (as above) or split on a separate line (as below)? Or use some heuristic to make the output more readable and compact?
>>> print(ast.dump(node, indent=3))
Module(
body=[
Expr(
value=Call(
func=Name(
id='spam',
ctx=Load()
),
args=[
Name(
id='eggs',
ctx=Load()
),
Constant(
value='and cheese',
kind=None
)
],
keywords=[]
)
)
],
type_ignores=[]
)
----------
components: Library (Lib)
messages: 350913
nosy: benjamin.peterson, brett.cannon, rhettinger, serhiy.storchaka, yselivanov
priority: normal
severity: normal
status: open
title: Multiline ast.dump()
type: enhancement
versions: Python 3.9
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue37995>
_______________________________________
More information about the New-bugs-announce
mailing list