为什么f'{'one'}'语法无效?在我看来,如果 f 字符串是明智的,那么一旦 a{出现,其中的所有内容都{ ... }应该被视为 Python 代码。
语言设计者决定将字符串的结束引号视为字符串结束的原因是什么,即使是在 的内部{ ... }?
由此带来什么好处?
关闭后编辑
注意:这是一个老问题。从 python 3.12 开始,这实际上是有效的语法。请参阅:https ://docs.python.org/3/whatsnew/3.12.html#whatsnew312-pep701
\n\n由于 Python\xe2\x80\x99s 字符串标记化规则,f 字符串
\nf\'abc {a[\'x\']} def\'无效。分词器将其解析为 3 个标记:f\'abc {a[\'、x和\']} def\'。就像常规字符串一样,这不能通过使用原始字符串来修复。
https://peps.python.org/pep-0498/#escape-sequences
\n他们为什么不“修复”标记器以使其成为可能?可能向后兼容。当一个简单的解决办法就是简单地在常见情况下进行"内部混合时,这可能是不值得的。\'
语法之所以如此,是因为语言是建立在由语法定义的块(令牌)之上的,该语法显示了如何构建令牌。Python 的 f 字符串重用了两个现有的构建块。首先,f\'和 尾随之间的所有内容\'都是有效的字符串内容。如果删除f,您的 Python 程序的语法仍然正确(尽管字符串的内容不是动态的)。你的例子\'{\'one\'}\'不符合这个条件。第二个条件是和之间的 代码是有效的 Python 表达式。是一个有效的表达式,但它必须满足两个条件。下一个替代方案是有效的字符串文字,但它是无效的表达式(例如,无法粘贴到 REPL 中) - 因此它也不会通过这两个条件。更改此设置将使 f 字符串在解析器中采用不同的路径,并且可能需要以前不需要的重复代码。有关标记化、语法和编译器设计的更多详细信息超出了本简短答案的范围。{}\'one\'\\\'one\\\'\\\'one\\\'