为什么缩进显式行继续不允许Python中的注释?

时间:2011-11-02 14:12:16

标签: python

我正在编写一个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,2010年4月16日,13:09:56)[GCC 4.4.3];但是,testing on ideone.com表明Python 3上的行为是相同的。

4 个答案:

答案 0 :(得分:4)

这是一个实施细节。

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

                 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部分,可以将所有三个示例视为有效:

  

可以使用两条或更多条物理线连接成逻辑线   反斜杠字符(\),如下所示:当物理行以a结尾时   反斜杠不是字符串文字或注释的一部分,它是   加入以下形成单个逻辑行,删除   反斜杠和下面的行尾字符。

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

答案 1 :(得分:2)

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

我认为关键的洞察力是线条延续字符使得Python将行视为而不仅仅是空格

  • a.py:似乎它将第一行视为空格。这是;一旦到达行继续符,它和新行就被删除了,因此在该行上没有其他内容它不存在用于解析 - 你只需要一行注释。注意:Jython 2.5.2基本上按预期处理;有望使用Python代码。

  • b.py:一旦达到行继续符,就不会进入注释,并且该行不再只是空格,缩进变为错误。

    < / LI>
  • c.py:评论再次无关紧要,您将获得与任意数量的空白和/或下一行评论相同的错误。你需要在行继续符后面的行上有实际的Python代码。

答案 2 :(得分:0)

\可以加入,EOL,EOF

所以这是有效的

\
# This is valid Python

但是这里

if True:
    \
    # This is not valid Python

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

答案 3 :(得分:0)

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

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