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

时间:2010-06-04 18:36:43

标签: python python-3.x

这可能不是一个惊天动地的蟒蛇缺乏,但我仍然 想知道以下行为背后的基本原理:当我 运行

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 个答案:

答案 0 :(得分:3)

更新

证实这确实是http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9指出的错误;错误报告位于http://bugs.python.org/issue1184112;它看起来固定在2.7和3.2。

溶液

一旦被识别,这个bug就非常容易修复:因为当一个换行添加到源文本时,一个有效的python源应该在语法上保持有效和语义不变,只需机械地对任何源文本执行操作。这让我想起了在汇编多文件javascript源代码时,机械地在源文本之间插入;分号,以便有效地将gzip压缩传送到远程客户端。