mirror of https://github.com/python/cpython
gh-106396: Special-case empty format spec to gen empty JoinedStr node (#106401)
This commit is contained in:
parent
8f6df5e9cb
commit
dfe4de2038
|
@ -496,6 +496,24 @@ x = (
|
|||
self.assertEqual(wat2.end_col_offset, 17)
|
||||
self.assertEqual(fstring.end_col_offset, 18)
|
||||
|
||||
def test_ast_fstring_empty_format_spec(self):
|
||||
expr = "f'{expr:}'"
|
||||
|
||||
mod = ast.parse(expr)
|
||||
self.assertEqual(type(mod), ast.Module)
|
||||
self.assertEqual(len(mod.body), 1)
|
||||
|
||||
fstring = mod.body[0].value
|
||||
self.assertEqual(type(fstring), ast.JoinedStr)
|
||||
self.assertEqual(len(fstring.values), 1)
|
||||
|
||||
fv = fstring.values[0]
|
||||
self.assertEqual(type(fv), ast.FormattedValue)
|
||||
|
||||
format_spec = fv.format_spec
|
||||
self.assertEqual(type(format_spec), ast.JoinedStr)
|
||||
self.assertEqual(len(format_spec.values), 0)
|
||||
|
||||
def test_docstring(self):
|
||||
def f():
|
||||
f'''Not a docstring'''
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
When the format specification of an f-string expression is empty, the parser now
|
||||
generates an empty :class:`ast.JoinedStr` node for it instead of an one-element
|
||||
:class:`ast.JoinedStr` with an empty string :class:`ast.Constant`.
|
|
@ -997,6 +997,18 @@ _PyPegen_setup_full_format_spec(Parser *p, Token *colon, asdl_expr_seq *spec, in
|
|||
if (!spec) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// This is needed to keep compatibility with 3.11, where an empty format spec is parsed
|
||||
// as an *empty* JoinedStr node, instead of having an empty constant in it.
|
||||
if (asdl_seq_LEN(spec) == 1) {
|
||||
expr_ty e = asdl_seq_GET(spec, 0);
|
||||
if (e->kind == Constant_kind
|
||||
&& PyUnicode_Check(e->v.Constant.value)
|
||||
&& PyUnicode_GetLength(e->v.Constant.value) == 0) {
|
||||
spec = _Py_asdl_expr_seq_new(0, arena);
|
||||
}
|
||||
}
|
||||
|
||||
expr_ty res = _PyAST_JoinedStr(spec, lineno, col_offset, end_lineno, end_col_offset, p->arena);
|
||||
if (!res) {
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue