这也许不是巨蟒的惊天动地的缺陷,但我仍然
想知道以下行为背后的基本原理:当我
运行
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__':\nprint( 'yeah!' )
行;(3)在来源。
而且,如果源端没有尾随换行符的话
在
print( 'yeah!' )
后面,源代码也将编译错误。
我还可以用python 2.6重现这种行为,所以这不是新的
3K系列。
我发现这个错误非常令人恼火,自从我
把上面的源代码放在一个文件中,直接执行它或让它
导入后,不会发生预期行为的错误。
字符串文本之外的
#
(哈希)应始终表示在python源中开始注释(可能为空);而且,
存在或不存在应
在句法层面上不改变对灵魂的解释。
是否有人能重现上述问题,和/或对
现象?
干杯
最佳答案
更新
事实证明这确实是一个bug,如http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9所指出的;bug报告位于http://bugs.python.org/issue1184112处;它似乎在2.7和3.2中被修复。
解决方案
一旦识别出来,这个bug就非常容易修复:因为有效的python源代码应该在源代码文本中添加换行符时保持语法有效和语义不变,所以机械地对任何源代码文本都这样做。这让我想起了在汇编多文件javascript源代码以有效地gzip向远程客户机传递时,在源代码文本之间机械地放置的分号。