Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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