diff -r dc407f50e823 Lib/test/test_fstring.py --- a/Lib/test/test_fstring.py Sat Nov 26 13:50:21 2016 +0200 +++ b/Lib/test/test_fstring.py Sat Nov 26 22:43:30 2016 +0200 @@ -70,18 +70,22 @@ f'{a * x()}'""" # Make sure x was called. self.assertTrue(x.called) + def test_docstring(self): + def f(): + f'''Not a docstring''' + self.assertIsNone(f.__doc__) + def g(): + '''Not a docstring''' \ + f'' + self.assertIsNone(f.__doc__) + def h(): + '''This is a docstring''' + f'{0}' + self.assertEqual(h.__doc__, 'This is a docstring') + def test_literal_eval(self): - # With no expressions, an f-string is okay. - self.assertEqual(ast.literal_eval("f'x'"), 'x') - self.assertEqual(ast.literal_eval("f'x' 'y'"), 'xy') - - # But this should raise an error. with self.assertRaisesRegex(ValueError, 'malformed node or string'): - ast.literal_eval("f'x{3}'") - - # As should this, which uses a different ast node - with self.assertRaisesRegex(ValueError, 'malformed node or string'): - ast.literal_eval("f'{3}'") + ast.literal_eval("f'x'") def test_ast_compile_time_concat(self): x = [''] diff -r dc407f50e823 Python/ast.c --- a/Python/ast.c Sat Nov 26 13:50:21 2016 +0200 +++ b/Python/ast.c Sat Nov 26 22:43:30 2016 +0200 @@ -4789,6 +4789,7 @@ ExprList_Finish(ExprList *l, PyArena *ar typedef struct { PyObject *last_str; ExprList expr_list; + int fmode; } FstringParser; #ifdef NDEBUG @@ -4807,6 +4808,7 @@ static void FstringParser_Init(FstringParser *state) { state->last_str = NULL; + state->fmode = 0; ExprList_Init(&state->expr_list); FstringParser_check_invariants(state); } @@ -4869,6 +4871,7 @@ FstringParser_ConcatFstring(FstringParse struct compiling *c, const node *n) { FstringParser_check_invariants(state); + state->fmode = 1; /* Parse the f-string. */ while (1) { @@ -4960,7 +4963,7 @@ FstringParser_Finish(FstringParser *stat /* If we're just a constant string with no expressions, return that. */ - if(state->expr_list.size == 0) { + if (!state->fmode && state->expr_list.size == 0) { if (!state->last_str) { /* Create a zero length string. */ state->last_str = PyUnicode_FromStringAndSize(NULL, 0); @@ -4984,11 +4987,6 @@ FstringParser_Finish(FstringParser *stat 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: diff -r dc407f50e823 Python/compile.c --- a/Python/compile.c Sat Nov 26 13:50:21 2016 +0200 +++ b/Python/compile.c Sat Nov 26 22:43:30 2016 +0200 @@ -3411,7 +3411,8 @@ static int compiler_joined_str(struct compiler *c, expr_ty e) { VISIT_SEQ(c, expr, e->v.JoinedStr.values); - ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values)); + if (asdl_seq_LEN(e->v.JoinedStr.values) != 1) + ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values)); return 1; }