Python 字符串字面量的冷幽默:raw 串不能以反斜杠结尾
来源:sebsite.pw — 2026-08-06
📋 概述
一篇简短的技术小品,用一个竞猜引入 Python 字符串字面量的有趣怪癖:raw 字符串字面量仍按普通字符串的规则词法解析,因此无法以反斜杠结尾——即使该反斜杠并非真正转义,它后面的引号也不会被当成字符串结束。文章接着展示了 f-string 里可以包含注释、跨行乃至嵌套引号表达式等更俏皮的例子。
🔑 核心要点
- r'asdf\' 是语法错误,而 r'asdf\'' 合法且结果是 asdf\'。这说明 raw 前缀并不像直觉想象的那样"原样照抄",它背后仍有一套严格到反直觉的词法规则。
- raw 串前缀只影响转义解释,不改变词法切分,所以仍不能以反斜杠结束。这意味着反斜杠在切分阶段就已参与决定字符串边界,用户无法靠 raw 前缀绕过这一限制。
- 这原本是为了简化实现而设计的,作者因此觉得后续例子更好笑。一个"为省事"的设计取舍,却意外衍生出无数让新手困惑的怪癖,反差本身就成了文章的笑点。
- f-string 的大括号内要跑一个完整 Python 解析器,表达式可以包含引号、跨多行甚至带注释。这说明 f-string 远比表面看起来强大,花括号里几乎是一个完整的子语言,写法上更加自由灵活。
- 表达式只被未加括号且非注释的 }、! 或 : 终止,故 lambda 与海象赋值必须加括号。这意味着这些结构内部若出现裸的 }、!、: 会被提前判为终止,所以开发者必须显式括起来才能安全使用。
💡 金句
词法一个 f-string 需要在大括号里的表达式上运行一整个 Python 解析器。
👍 0
👎 0
← 返回 Lobsters 首页