【问题标题】:Why do indented explicit line continuations not allow comments in Python?为什么缩进显式续行不允许 Python 中的注释?
【发布时间】:2011-11-02 14:12:16
【问题描述】:

我正在编写一个 Python 解析器来学习 Flex 和 Bison,并试图找出为什么这些程序中只有第一个是有效的 Python。

a.py:

\
# This is valid Python

不会产生错误。

b.py:

    \
# This is not valid Python

产生这个错误:

  File "b.py", line 1
    \
    ^
IndentationError: unexpected indent

c.py:

if True:
    pass
    \
    # This is not valid Python

产生这个错误:

  File "c.py", line 4
    # This is not valid Python
                             ^
SyntaxError: invalid syntax

我在 linux2 (Ubuntu 10.04) 上使用 Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3];但是,testing on ideone.com 表明在 Python 3 上的行为是相同的。

【问题讨论】:

  • 你为什么要这样做?
  • 扪心自问,为什么我要在评论前的空白行续行?
  • @这不是我想这样写代码,而是我正在写一个Python解析器来学习flex+bison,我想知道为什么这无效.

标签: python


【解决方案1】:

这是一个实现细节。

以下是一些不同的实现如何响应您的代码:

                 a.py  b.py  c.py    
                 ----  ----  ----
CPython 2.6.5     ok    bad   bad
CPython 3.?       ok    bad   bad
Jython 2.2.1      ok    ok    bad
Jython 2.5.2      bad   bad   bad
IronPython 2.7.1  ok    bad   ok

我对 Python 语言参考的 Exlplicit Line Joining 部分的阅读是,所有三个示例都可以被视为有效:

两条或多条物理线可以通过以下方式连接成逻辑线 反斜杠字符 (\),如下所示:当物理行以 反斜杠不是字符串文字或注释的一部分,它是 与以下连接形成一个逻辑行,删除 反斜杠和以下行尾字符。

如果 CPython 被更改为接受所有三个示例为有效,我怀疑它会被用户注意到、更改语言的字符或破坏任何代码。

【讨论】:

  • @agf:也许我应该做一个更短的引用,但我想为我阅读这个关键句子提供上下文:“当物理行以不属于字符串的反斜杠结尾时文字或注释,它与以下内容连接形成一个逻辑行,删除反斜杠和以下行尾字符。”如果我们将此规则应用于示例代码,那么所有这些构造都应该是可以接受的。但他们不是,所以我想这是一个实现细节。
  • 我认为这个想法是行继续字符使该行不再只是空白 - 行上有一些东西,因此不会出现应用于空白/注释行的松弛。看我的回答。
  • 有趣。 Jython 2.2.1 接受 a 和 b,但不接受 c。但是,Jython 2.5.2 不接受其中任何一个(尽管如果我添加后续语句,它将接受 a,但不接受 b 或 c)。
  • @agf 不完全是。 2.5.2 的行为似乎是完全忽略包含注释的行,因此它仍然期望在行继续符之后有一个语句。将额外的语句放在开头没有帮助;它必须在最后。
  • 我刚刚检查了 IronPython 2.7。它接受a.pyc.py。它在b.py 上窒息,给出SyntaxError: invalid syntax 而不是CPython 给出的IndentationError
【解决方案2】:

史蒂文的引用是相关的,但它仍然不能直接解释这种情况。

我认为关键的见解是行继续字符使 Python 将一行视为 而不仅仅是空格

  • a.py: 好像它把第一行当作空格。 不是;一旦到达续行字符,它和换行符就会被删除,因此由于该行上没有其他内容,因此出于解析的目的它不存在——您只有一行带有注释。注意:Jython 2.5.2 基本按预期处理;有效的 Python 代码应该在后面的一行中。

  • b.py:永远不要进入注释,一旦到达续行字符,并且该行不再只是空格,缩进就会出错。

  • c.py: 注释再次无关紧要,任何数量的空格和/或下一行的注释都会出现相同的错误。您需要在续行符之后的行中有实际的 Python 代码。

【讨论】:

    【解决方案3】:

    \可以加入,EOL,EOF

    所以这行得通

    \
    # This is valid Python
    

    这里

    if True:
        \
        # This is not valid Python
    

    \ 之后,解析器正在寻找一个不存在的缩进行。

    【讨论】:

    • 除了第一个工作,即使它后面没有 EOF(后面的其他行),第二个即使在空格/注释行之后有另一个缩进行也不起作用。还要注意第二个错误是SyntaxError 而不是IndentationError
    【解决方案4】:

    Guido 经常在他的博客和邮件中提醒他希望 Python 解析器的实现尽可能简单。

    我不认为这是一种预期的行为,我认为这是具有严格而简单的语法的副作用。有些东西是不允许的,没有人愿意检查它们是否是因为这无关紧要。

    【讨论】:

    • 这可能是也可能不是有意行为,但它是可解释行为。此外,我不确定是否有任何证据表明将其保留为 LL(1) 解析器的决定是相关的。
    猜你喜欢
    • 2017-11-03
    • 2011-11-01
    • 1970-01-01
    • 2013-03-13
    • 2011-10-04
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多