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

上次修改时间:2023年9月9日 17:39:29 GMT