为什么f弦在字典中不能很好地播放?

时间:2018-11-23 15:26:12

标签: python string python-3.x syntax-error

here所述,

f字符串与字典一起使用时表现不佳。

以下是一个不太好的行为的示例:

d = {'foo': 'bar'}

# Both work as expected
d["foo"]
d['foo']

# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"

# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"

# The .format() method doesn't care
'{}'.format(d['foo'])

列出的最后两个f字符串导致SyntaxError: invalid syntax,这是因为字符串'{d['foo']}'被评估为'{d[' foo ']}'

像使用旧的.format()方法那样,未分别评估f字符串大括号内的所有内容的根本原因是什么,可能是在其中实现f字符串的原因?方式吗?

我喜欢f弦,但这似乎是赞成旧方法的观点。

3 个答案:

答案 0 :(得分:1)

在引号中包括引号的traditional way是使用反斜杠。但是PEP498禁止在f字符串中的表达式中使用反斜杠:

  

反斜杠可能不会出现在的表达式部分内   f字符串...您可以在表达式内使用不同类型的报价 ...

因此,在给定f字符串表达式中的键的情况下,访问字典值的唯一方法就是使用不同的类型引号。使用单引号或双引号,到处都是模棱两可的,并给出SyntaxError

str.format是一种常规方法,其工作原理有所不同:d['foo']是在构造字符串之前 求值的。就像当您向函数提供参数时一样,在函数执行任何操作之前先对参数求值。

答案 1 :(得分:0)

这与f字符串无关。 f字符串是经过评估的常见字符串。您尝试的也是标准字符串的问题

问题是

'a "b" c' 

声明文字a "b" c

同时

'a 'b' c'

引号关闭并重新打开。因此,它等效于字符串a,后跟变量b,后跟字符串c

这就是python支持两种引号的全部原因

答案 2 :(得分:0)

根据PEP 498,f字符串依赖于常规字符串文字的实现,因此受到相同的约束。除此以外,f字符串还有其自身的约束条件,例如排除表达式中任何地方的反斜杠。

关于实现方式选择的原理尚未公开,但是实现方式的易用性,向后兼容性,语法突出显示以及与现有内插语法的一致性,这些都是公开可访问的邮件列表上的核心开发人员之间的讨论中的全部内容。 1

争论的中心点是所提议的概念是构成具有特殊属性的字符串还是插入代码的字符串。 2 前一种观点受到青睐。 PEP 536体现了不同的观点,并另外寻求解除一些语法约束。

基于此讨论,达成了在表达式中禁止反斜杠的尝试性折衷方案,将字符串定界符倒置作为索引f字符串表达式中字典的唯一剩余选择。


  1. 选择在引入f字符串之前的讨论(Python 3.6):

    [Python-ideas] Briefer string format
    Re: [Python-ideas] Briefer string format
    Re: [Python-ideas] Briefer string format
    [Python-ideas] String interpolation for all literal strings
    [Python-Dev] PEP-498: Literal String Formatting
    [Python-Dev] PEP 498 f-string: is it a preprocessor?
    [Python-Dev] PEP 498 href="interpolated f-string" tweak
    [Python-Dev] Parsing f-strings from PEP 498 -- Literal String Interpolation

  2. [Python-ideas] Let’s make escaping in f-literals impossible