这可能不是一个惊天动地的蟒蛇缺乏,但我仍然 想知道以下行为背后的基本原理:当我 运行
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__'
条款
不要在句法层面上改变对一个灵魂的解释。
任何人都可以重现上述问题,和/或评论 现象?
欢呼答案 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压缩传送到远程客户端。