我正在编写一个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上的行为是相同的。
答案 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
:一旦达到行继续符,就不会进入注释,并且该行不再只是空格,缩进变为错误。
c.py
:评论再次无关紧要,您将获得与任意数量的空白和/或下一行评论相同的错误。你需要在行继续符后面的行上有实际的Python代码。
答案 2 :(得分:0)
\
可以加入,EOL,EOF
所以这是有效的
\
# This is valid Python
但是这里
if True:
\
# This is not valid Python
在\
之后,解析器正在寻找一条不存在的缩进行。
答案 3 :(得分:0)
Guido经常在他的博客和邮件帖子中提醒他,他希望尽可能简化Python解析器的实现。
我不认为这是一种预期的行为,我认为这是一种严格而简单的语法的副作用。有些东西是不允许的,没有人会关心它们是否因为无关紧要。