Why isn't it possible to use backslashes in f-strings?

蹲街弑〆低调 提交于 2019-12-23 22:42:48

问题


In Python >=3.6, f-strings can be used as a replacement for the str.format method. As a simple example, these are equivalent:

'{} {}'.format(2+2, "hey")
f'{2+2} {"hey"}'

Disregarding format specifiers, I can basically move the positional arguments of str.format inside braces in an f-string. Note specifically that I am allowed to just put str literals in here, although it may seem a bit unwieldy.

There are however some limitations. Specifically, backslashes in any shape or form are disallowed inside the braces of an f-string:

'{}'.format("new\nline")  # legal
f'{"new\nline"}'          # illegal
f'{"\\"}'                 # illegal

I cannot even use \ to split up a long line if it's inside the braces;

f'{2+\
2}'     # illegal

even though this usage of \ is perfectly allowed inside normal str's;

'{\
}'.format(2+2)  # legal

It seems to me that a hard stop is coded into the parser if it sees the \ character at all inside the braces of an f-string. Why is this limitation implemented? Though the docs specify this behavior, it does not justify why.


回答1:


You seem to expect

'{}'.format("new\nline")

and

f'{"new\nline"}'

to be equivalent. That's not what I would expect, and it's not how backslashes in f-strings worked back in the pre-release versions of Python 3.6 where backslashes between the braces were allowed. Back then, you'd get an error because

"new
line"

is not a valid Python expression.

As just demonstrated, backslashes in the braces are confusing and ambiguous, and they were banned to avoid confusion:

The point of this is to disallow convoluted code like:

>>> d = {'a': 4}
>>> f'{d[\'a\']}'
'4'

In addition, I'll disallow escapes to be used for brackets, as in:

>>> f'\x7bd["a"]}'
'4'

(where chr(0x7b) == "{").



来源:https://stackoverflow.com/questions/51775950/why-isnt-it-possible-to-use-backslashes-in-f-strings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!