Skip to content

Commit

Permalink
Merge with 3.6
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco committed Nov 6, 2016
2 parents 32d93b2 + f66f03b commit 692b97c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 12 deletions.
19 changes: 12 additions & 7 deletions Doc/reference/lexical_analysis.rst
Original file line number Diff line number Diff line change
Expand Up @@ -679,17 +679,22 @@ Some examples of formatted string literals::

A consequence of sharing the same syntax as regular string literals is
that characters in the replacement fields must not conflict with the
quoting used in the outer formatted string literal. Also, escape
sequences normally apply to the outer formatted string literal,
rather than inner string literals::
quoting used in the outer formatted string literal::

f"abc {a["x"]} def" # error: outer string literal ended prematurely
f"abc {a[\"x\"]} def" # workaround: escape the inner quotes
f"abc {a['x']} def" # workaround: use different quoting

f"newline: {ord('\n')}" # error: literal line break in inner string
f"newline: {ord('\\n')}" # workaround: double escaping
fr"newline: {ord('\n')}" # workaround: raw outer string
Backslashes are not allowed in format expressions and will raise
an error::

f"newline: {ord('\n')}" # raises SyntaxError

To include a value in which a backslash escape is required, create
a temporary variable.

>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'

See also :pep:`498` for the proposal that added formatted string literals,
and :meth:`str.format`, which uses a related format string mechanism.
Expand Down
13 changes: 8 additions & 5 deletions Lib/test/test_fstring.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,11 +382,14 @@ def test_no_backslashes_in_expression_part(self):
])

def test_no_escapes_for_braces(self):
# \x7b is '{'. Make sure it doesn't start an expression.
self.assertEqual(f'\x7b2}}', '{2}')
self.assertEqual(f'\x7b2', '{2')
self.assertEqual(f'\u007b2', '{2')
self.assertEqual(f'\N{LEFT CURLY BRACKET}2\N{RIGHT CURLY BRACKET}', '{2}')
"""
Only literal curly braces begin an expression.
"""
# \x7b is '{'.
self.assertEqual(f'\x7b1+1}}', '{1+1}')
self.assertEqual(f'\x7b1+1', '{1+1')
self.assertEqual(f'\u007b1+1', '{1+1')
self.assertEqual(f'\N{LEFT CURLY BRACKET}1+1\N{RIGHT CURLY BRACKET}', '{1+1}')

def test_newlines_in_expressions(self):
self.assertEqual(f'{0}', '0')
Expand Down

0 comments on commit 692b97c

Please sign in to comment.