python,版本2.6和3.1中的奇怪语法错误

flo*_*low 9 python python-3.x

这可能不是一个惊天动地的python缺陷,但我仍然怀疑以下行为背后的基本原理:当我跑

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

#"""

print( compile( source, '<whatever>', 'exec' ) )
Run Code Online (Sandbox Code Playgroud)

我得到::

  File "<whatever>", line 6
    #
    ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我可以通过(1)删除尾随来避免这种例外#; (2)删除或删除这些if __name__ == '__main__':\n print( 'yeah!' )行; (3)在源的最后添加换行符.

而且,如果我的源端没有后面的尾随换行符print( 'yeah!' ),那么源代码也会编译而不会出错.

我也可以用python 2.6重现这种行为,所以它对3k系列来说并不陌生.

我发现这个错误非常令人恼火,因为当我将上面的源放在文件中并直接执行它或导入它时,不会发生错误 - 这是预期的行为.

#字符串文字外的a (哈希)应始终表示python源中(可能为空)注释的开头; 而且,if __name__ == '__main__'条款的存在与否不 应该在句法层面上改变对一个灵魂的解释.

任何人都可以重现上述问题,和/或评论这种现象吗?

干杯

flo*_*low 3

更新

事实证明,这确实是一个错误,正如http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9所指出的那样;错误报告位于http://bugs.python.org/issue1184112;它似乎在 2.7 和 3.2 中得到修复。

解决方案

一旦识别出来,这个错误就非常容易修复:因为当将换行符添加到源文本时,有效的 python 源应该保持语法有效和语义不变,因此只需机械地对任何源文本执行此操作即可。这让我想起了;在组装多文件 JavaScript 源代码以高效地通过 gzip 压缩传送到远程客户端时,您机械地在源文本之间放置的分号。