PEP 3125 – 删除反斜杠续行
- 作者:
- Jim J. Jewett <JimJJewett at gmail.com>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2007年4月29日
- 发布历史:
- 2007年4月29日, 2007年4月30日, 2007年5月4日
拒绝通知
此 PEP 被拒绝。支持不足,要删除的特性并非危害很大,并且有一些用例会变得更困难。
摘要
Python 最初是从 C 继承其解析方式的。虽然这总体上很有用,但其中一些遗留特性对 Python 来说不太有用,应该被消除。
此 PEP 提议消除用行尾 \ 作为行续接标记。
动机
Python 3000 的一个目标应该是通过移除不必要或重复的特性来简化语言。目前有几种方法可以指示逻辑行在下一物理行上继续。
其他续接方法很容易解释为它们所提供的语义的逻辑结果;而 \ 只是一个需要记忆的转义字符。
现有的行续接方法
括号表达式 - ([{}])
打开一个括号表达式。人们是否认为“行”已续接并不重要;他们会立即意识到表达式必须在语句结束前关闭。
使用 ()、[] 和 {} 的示例
def fn(long_argname1,
long_argname2):
settings = {"background": "random noise",
"volume": "barely audible"}
restrictions = ["Warrantee void if used",
"Notice must be received by yesterday",
"Not responsible for sales pitch"]
请注意,表达式始终可以加上括号,但这对于仅为换行而需要括号的表达式来说可能显得有些奇怪。
assert val>4, (
"val is too small")
三引号字符串
打开一个三引号字符串;同样,人们会意识到字符串必须在下一条语句开始前结束。
banner_message = """
Satisfaction Guaranteed,
or DOUBLE YOUR MONEY BACK!!!
some minor restrictions apply"""
一般情况下的行尾 \
行尾的 \ 表示逻辑行在下一物理行(空格之后)继续。这没有特殊的语义。这种形式从未被强制要求,尽管在某些情况下(尤其对于有 C 语言背景的人来说)它可能看起来更好。
>>> assert val>4, \
"val is too small"
还要注意,\ 必须是行中的最后一个字符。如果您的编辑器导航在行尾添加了空格,那么这种无形的更改将改变程序的语义。幸运的是,典型的结果只是一个语法错误,而不是运行时错误。
>>> assert val>4, \
"val is too small"
SyntaxError: unexpected character after line continuation character
此 PEP 提议消除这种冗余且可能令人困惑的替代方案。
字符串内的行尾 \
行尾的 \ 在单引号字符串内。这可以说是行尾 \ 的一个特例,但它是一个可能值得保留的特例。
>>> "abd\
def"
'abd def'
- 优点:反对删除
\续行的许多异议实际上只是反对删除字符串内的续行;一些人澄清说,他们希望保留这种字符串字面量的用法,但并不介意删除一般情况。 - 优点:在字符串中使用
\作为转义字符是众所周知的。 - 缺点:但请注意,这种特殊用法很奇怪,因为被转义的字符(换行符)是不可见的,而特殊处理是删除该字符。尽管如此,
\(newline)的\仍然是一个改变后续字符含义的转义。
替代提案
许多人建议用其他方式标记行尾。其中大多数被拒绝,因为它们并没有真正简化事情。
唯一的例外是允许任何未完成的表达式表示行续接,可能结合增加缩进。
这很有吸引力,因为它是括号规则的泛化。
最初对此的反对意见是:
- 空格量可能存在争议;表达式续接不应与打开新块混淆。
- Python 中的“表达式续接”标记不像分组标点符号“(), [], {}”那样清晰。
# Plus needs another operand, so the line continues "abc" + "def" # String ends an expression, so the line does not # not continue. The next line is a syntax error because # unary plus does not apply to strings. "abc" + "def"
- Guido 出于技术原因反对。 [1] 最明显的实现方式将要求允许在任何地方使用 INDENT 或 DEDENT 标记,或者至少在广泛扩展(且定义不清)的位置集上。虽然这仅对内部解析机制(而不是用户)有影响,但它将成为复杂性的一个主要新来源。
Andrew Koenig 随后指出了 [2] 一种更好的实现策略,并表示它在其他语言中效果很好。 [3] 改进后的建议归结为:
在(运算符或)开括号或圆括号后面的空格可以包含换行符。这将在非常低的词法级别实现——甚至在决定将换行符后跟空格转换为 INDENT 或 DEDENT 标记之前。
仍然有人担心它可能会掩盖错误,如下例 [4]
# Used to be y+1, the 1 got dropped. Syntax Error (today)
# would become nonsense.
x = y+
f(x)
要求续接行的缩进比初始行多,将同时增加安全性和复杂性。
未解决的问题
- 是否应在字符串内部也删除
\续行? - 是否应将续接标记从仅 ([{}]) 扩展到包含行尾的运算符?
- 作为一项安全措施,是否应要求续接行的缩进比初始行多?
参考资料
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-3125.rst
最后修改: 2025-02-01 08:59:27 GMT