From f07ca2b209aacc24bf5db24c0d7420304bcd9b76 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 4 Feb 2026 17:28:05 +0530 Subject: [PATCH] Fix f-string debug format parsing for Python 3.8+ --- pasta/base/annotate.py | 9 ++++++--- pasta/base/annotate_test.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/pasta/base/annotate.py b/pasta/base/annotate.py index 861eaf3..10992f7 100644 --- a/pasta/base/annotate.py +++ b/pasta/base/annotate.py @@ -1265,10 +1265,13 @@ def check_slice_includes_step(self, node): @fstring_expression def visit_FormattedValue(self, node): self.visit(node.value) + self.optional_token(node, 'debug_specifier', '=') if node.conversion != -1: - self.attr(node, 'conversion', - [self.ws, '!', chr(node.conversion)], deps=('conversion',), - default='!%c' % node.conversion) + self.optional_token(node, 'conversion_prefix', '!') + if fmt.get(node, 'conversion_prefix'): + self.attr(node, 'conversion_char', + [chr(node.conversion)], deps=('conversion',), + default='%c' % node.conversion) if node.format_spec: self.attr(node, 'format_spec_prefix', [self.ws, ':', self.ws], default=':') diff --git a/pasta/base/annotate_test.py b/pasta/base/annotate_test.py index ffd698a..32dd2b5 100644 --- a/pasta/base/annotate_test.py +++ b/pasta/base/annotate_test.py @@ -454,6 +454,18 @@ def test_fstring_escaping(self): fmt.get(node, 'content'), 'f"a {{{__pasta_fstring_val_0__} {{c}}"') + @test_utils.requires_features('fstring') + def test_fstring_debug_format(self): + src = 'f"{a=}"' + self.assertEqual(src, pasta.dump(pasta.parse(src))) + src = 'f"{a=!r}"' + self.assertEqual(src, pasta.dump(pasta.parse(src))) + src = 'f"{a=:d}"' + self.assertEqual(src, pasta.dump(pasta.parse(src))) + src = 'f"{a=!r:10}"' + self.assertEqual(src, pasta.dump(pasta.parse(src))) + src = 'f"prefix {x=} suffix"' + self.assertEqual(src, pasta.dump(pasta.parse(src))) class VersionSupportTest(test_utils.TestCase):