mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #28739: f-string expressions no longer accepted as docstrings and
by ast.literal_eval() even if they do not include subexpressions.
This commit is contained in:
commit
0f6373c34f
4 changed files with 20 additions and 17 deletions
11
Python/ast.c
11
Python/ast.c
|
@ -4784,6 +4784,7 @@ ExprList_Finish(ExprList *l, PyArena *arena)
|
|||
typedef struct {
|
||||
PyObject *last_str;
|
||||
ExprList expr_list;
|
||||
int fmode;
|
||||
} FstringParser;
|
||||
|
||||
#ifdef NDEBUG
|
||||
|
@ -4802,6 +4803,7 @@ static void
|
|||
FstringParser_Init(FstringParser *state)
|
||||
{
|
||||
state->last_str = NULL;
|
||||
state->fmode = 0;
|
||||
ExprList_Init(&state->expr_list);
|
||||
FstringParser_check_invariants(state);
|
||||
}
|
||||
|
@ -4864,6 +4866,7 @@ FstringParser_ConcatFstring(FstringParser *state, const char **str,
|
|||
struct compiling *c, const node *n)
|
||||
{
|
||||
FstringParser_check_invariants(state);
|
||||
state->fmode = 1;
|
||||
|
||||
/* Parse the f-string. */
|
||||
while (1) {
|
||||
|
@ -4955,7 +4958,8 @@ FstringParser_Finish(FstringParser *state, struct compiling *c,
|
|||
|
||||
/* If we're just a constant string with no expressions, return
|
||||
that. */
|
||||
if(state->expr_list.size == 0) {
|
||||
if (!state->fmode) {
|
||||
assert(!state->expr_list.size);
|
||||
if (!state->last_str) {
|
||||
/* Create a zero length string. */
|
||||
state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
|
||||
|
@ -4979,11 +4983,6 @@ FstringParser_Finish(FstringParser *state, struct compiling *c,
|
|||
if (!seq)
|
||||
goto error;
|
||||
|
||||
/* If there's only one expression, return it. Otherwise, we need
|
||||
to join them together. */
|
||||
if (seq->size == 1)
|
||||
return seq->elements[0];
|
||||
|
||||
return JoinedStr(seq, LINENO(n), n->n_col_offset, c->c_arena);
|
||||
|
||||
error:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue