From 1680c66f4c994260a653b479c9bdd8cdf22dc39f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 30 May 2025 17:25:07 +0300 Subject: [PATCH] [3.13] gh-134718: Fix ast.dump() for empty non-default values (GH-134926) (cherry picked from commit cc344e8dd0a6fdc83a032c229f9b3cf53f76a887) Co-authored-by: Serhiy Storchaka --- Lib/ast.py | 22 +++++++++---------- Lib/test/test_ast/test_ast.py | 12 ++++++++++ ...-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst | 2 ++ 3 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-30-13-07-29.gh-issue-134718.9Qvhxn.rst diff --git a/Lib/ast.py b/Lib/ast.py index 1a88d23c585202..37b20206b8af4f 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -151,18 +151,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 db2ea9f546eb1a..7cedb13e923547 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -1346,12 +1346,24 @@ 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='')", 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.