为什么缩进的显式行延续不允许在Python中使用注释?

2024-06-16 11:03:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

a.py

\
# This is valid Python

不会产生错误。

b.py

^{pr2}$

产生此错误:

  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(Ubuntu10.04)上使用的是Python2.6.5(r265:790632010年4月16日,13:09:56)[gcc4.4.3];但是,testing on ideone.com表明在Python3上的行为是相同的。


Tags: py程序解析器is错误linenotthis
3条回答

这是一个细节。在

下面是几种不同的实现如何响应您的代码:

                 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部分的理解是,这三个示例都可以视为有效:

Two or more physical lines may be joined into logical lines using backslash characters (\), as follows: when a physical line ends in a backslash that is not part of a string literal or comment, it is joined with the following forming a single logical line, deleting the backslash and the following end-of-line character.

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

\可以加入,EOL,EOF

所以这是有效的

\
# This is valid Python

但在这里

^{pr2}$

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

史蒂文的话很贴切,但仍然不能直接解释这种情况。在

我认为关键的一点是,行延续字符使Python将一行视为而不仅仅是空白。在

  • a.py:它似乎把第一行当作空白。它是而不是;一旦到达行延续字符,它和换行符都将被删除,因此,由于该行上没有其他内容,因此它不存在于解析目的——您只需要一行带有注释的行。注意:jython2.5.2基本上和预期的一样;有效的Python代码应该在后面的一行中出现。

  • b.py:永远不要将其添加到注释中,一旦行的连续字符到达,并且该行不再只是空白,缩进就变成一个错误。

  • c.py:注释又是不相关的,任何空格和/或下一行的注释都会出现相同的错误。您需要将实际的Python代码放在行继续符的后面。

相关问题 更多 >