Python 3.6中同引号类型的字符串字面量为何无法在f-string中使用?
为什么f-string使用同类型引号会触发语法错误?这是Bug吗?
这个问题我刚接触f-string的时候也踩过一模一样的坑!先直接给结论:这绝对不是Python的Bug,而是语法解析的有意设计,本质是Python字符串字面量的基本规则在起作用。
问题根源:字符串的边界标记规则
Python里所有字符串字面量(不管是普通字符串还是f-string),都是用相同的引号来标记开头和结尾的:
- 单引号字符串以
'开头,必须以'结尾 - 双引号字符串以
"开头,必须以"结尾
当你写f'Hello {table['username']}'时,外层f-string用的是单引号,Python解析到table[后面的'时,会直接把这个'当成整个f-string的结束标记——剩下的username']}就成了无意义的、脱离字符串的代码,自然触发语法错误。
解决方案
有几种简单的方式避免这个问题:
- 混用引号类型:像例子里那样,外层用双引号,内部用单引号(或者反过来):
msg = f"Hello {table['username']}" # 正常工作 msg = f'Hello {table["username"]}' # 同样正常工作 - 使用三引号:如果需要在字符串里同时出现单双引号,三引号的f-string是更好的选择,内部的单/双引号不会被当成边界标记:
msg = f'''Hello {table['username']}, your email is {user["email"]}''' - 转义引号:虽然可以用转义符
\'或\",但可读性较差,不推荐:msg = f'Hello {table[\'username\']}' # 能运行,但看着费劲
总结
这不是f-string特有的问题,Python中所有普通字符串也遵循同样的规则——比如你写'I'm a student'也会报错,道理是完全一样的。这是Python语法解析的基础逻辑,是有意设计的行为,目的是让编译器能清晰识别字符串的边界。
内容的提问来源于stack exchange,提问作者James Ko
相关产品推荐
相关产品推荐

