在Python 2.6和3.1中出现奇怪的语法错误

9 投票
1 回答
1400 浏览
提问于 2025-04-15 23:34

这可能不是Python的一个致命缺陷,但我还是想知道为什么会出现以下这种情况:当我运行

source = """
print( 'helo' )
if __name__ == '__main__':
  print( 'yeah!' )

#"""

print( compile( source, '<whatever>', 'exec' ) )

时,我得到的是::

  File "<whatever>", line 6
    #
    ^
SyntaxError: invalid syntax

我可以通过以下方式避免这个错误:(1) 删除末尾的#;(2) 删除或注释掉if __name__ == '__main__':\n print( 'yeah!' )这几行;(3) 在文件的最后加一个空行。

而且,如果我在print( 'yeah!' )后面没有加空行,代码也能正常运行,没有错误。

我在Python 2.6中也能复现这个问题,所以这并不是3k系列的新问题。

我觉得这个错误非常烦人,尤其是当我把上面的代码放在一个文件里直接执行或者导入时,根本不会出现错误——这才是我期待的结果。

在Python代码中,#(井号)应该总是表示一个(可能是空的)注释的开始;而且,是否有if __name__ == '__main__'这一句不应该改变代码的语法解析。

有没有人能复现这个问题,或者对这个现象发表一些看法?

谢谢!

1 个回答

3

更新

结果证明这确实是一个错误,正如这里所指出的;这个错误的报告可以在这里找到;看起来在2.7和3.2版本中已经修复了。

解决方案

一旦识别出这个错误,修复起来非常简单:因为一个有效的Python代码在添加换行符后,应该在语法上依然有效,语义上也不变,所以只需要机械地对任何源代码文本进行这样的处理。这让我想起了在组装多文件的JavaScript代码时,为了高效地压缩传输到远程客户端,你需要在源代码之间机械地加上;分号。

撰写回答