代码之家  ›  专栏  ›  技术社区  ›  flow

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

  •  9
  • flow  · 技术社区  · 15 年前

    这也许不是巨蟒的惊天动地的缺陷,但我仍然 想知道以下行为背后的基本原理:当我 运行

    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系列。

    我发现这个错误非常令人恼火,自从我 把上面的源代码放在一个文件中,直接执行它或让它 导入后,不会出现预期行为的错误。

    γ (hash)字符串文本外部应始终表示 在python源中开始注释(可能为空);而且, 存在或不存在 if __name__ == '__main__' 条款应 在句法层面上不改变对灵魂的解释。

    是否有人能重现上述问题,和/或评论 现象?

    干杯

    1 回复  |  直到 15 年前
        1
  •  3
  •   flow    15 年前

    更新

    事实证明这确实是一个错误,正如 http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9 ;错误报告位于 http://bugs.python.org/issue1184112 ;在2.7和3.2中似乎是固定的。

    解决方案

    一旦识别出来,这个bug就非常容易修复:因为有效的python源代码应该在源代码文本中添加换行符时保持语法有效和语义不变,所以机械地对任何源代码文本都这样做。这让我想起 ; 在汇编多文件的javascript源代码时,您机械地将分号放在源代码文本之间,以便高效地将gzip传递到远程客户机。