https://github.com/python/cpython/commit/cc344e8dd0a6fdc83a032c229f9b3cf53f76a887
commit: cc344e8dd0a6fdc83a032c229f9b3cf53f76a887
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-05-30T17:25:07+03:00
summary:
gh-134718: Fix ast.dump() for empty non-default values (GH-134926)
files:
A Misc/NEWS.d/next/Library/2025-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst
M Lib/ast.py
M Lib/test/test_ast/test_ast.py
diff --git a/Lib/ast.py b/Lib/ast.py
index b9791bf52d3e08..2f11683ecf7c68 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -147,18 +147,16 @@ def _format(node, level=0):
if value is None and getattr(cls, name, ...) is None:
keywords = True
continue
- if (
- not show_empty
- and (value is None or value == [])
- # Special cases:
- # `Constant(value=None)` and `MatchSingleton(value=None)`
- and not isinstance(node, (Constant, MatchSingleton))
- ):
- args_buffer.append(repr(value))
- continue
- elif not keywords:
- args.extend(args_buffer)
- args_buffer = []
+ if not show_empty:
+ if value == []:
+ field_type = cls._field_types.get(name, object)
+ if getattr(field_type, '__origin__', ...) is list:
+ if not keywords:
+ args_buffer.append(repr(value))
+ continue
+ if not keywords:
+ args.extend(args_buffer)
+ args_buffer = []
value, simple = _format(value, level)
allsimple = allsimple and simple
if keywords:
diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py
index 46745cfa8f8325..59263012bc1440 100644
--- a/Lib/test/test_ast/test_ast.py
+++ b/Lib/test/test_ast/test_ast.py
@@ -1543,18 +1543,42 @@ def check_text(code, empty, full, **kwargs):
full="MatchSingleton(value=None)",
)
+ check_node(
+ ast.MatchSingleton(value=[]),
+ empty="MatchSingleton(value=[])",
+ full="MatchSingleton(value=[])",
+ )
+
check_node(
ast.Constant(value=None),
empty="Constant(value=None)",
full="Constant(value=None)",
)
+ check_node(
+ ast.Constant(value=[]),
+ empty="Constant(value=[])",
+ full="Constant(value=[])",
+ )
+
check_node(
ast.Constant(value=''),
empty="Constant(value='')",
full="Constant(value='')",
)
+ check_node(
+ ast.Interpolation(value=ast.Constant(42), str=None, conversion=-1),
+ empty="Interpolation(value=Constant(value=42), str=None,
conversion=-1)",
+ full="Interpolation(value=Constant(value=42), str=None,
conversion=-1)",
+ )
+
+ check_node(
+ ast.Interpolation(value=ast.Constant(42), str=[], conversion=-1),
+ empty="Interpolation(value=Constant(value=42), str=[],
conversion=-1)",
+ full="Interpolation(value=Constant(value=42), str=[],
conversion=-1)",
+ )
+
check_text(
"def a(b: int = 0, *, c): ...",
empty="Module(body=[FunctionDef(name='a',
args=arguments(args=[arg(arg='b', annotation=Name(id='int', ctx=Load()))],
kwonlyargs=[arg(arg='c')], kw_defaults=[None], defaults=[Constant(value=0)]),
body=[Expr(value=Constant(value=Ellipsis))])])",
diff --git
a/Misc/NEWS.d/next/Library/2025-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst
b/Misc/NEWS.d/next/Library/2025-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst
new file mode 100644
index 00000000000000..922ab168fdd095
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst
@@ -0,0 +1,2 @@
+:func:`ast.dump` now only omits ``None`` and ``[]`` values if they are
+default values.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]