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
上次修改时间:2023年9月9日 17:39:29 GMT