这可能不是一个惊天动地的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__'
条款的存在与否不 应该在句法层面上改变对一个灵魂的解释.
任何人都可以重现上述问题,和/或评论这种现象吗?
干杯
事实证明,这确实是一个错误,正如http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9所指出的那样;错误报告位于http://bugs.python.org/issue1184112;它似乎在 2.7 和 3.2 中得到修复。
一旦识别出来,这个错误就非常容易修复:因为当将换行符添加到源文本时,有效的 python 源应该保持语法有效和语义不变,因此只需机械地对任何源文本执行此操作即可。这让我想起了;
在组装多文件 JavaScript 源代码以高效地通过 gzip 压缩传送到远程客户端时,您机械地在源文本之间放置的分号。
归档时间: |
|
查看次数: |
1145 次 |
最近记录: |