【问题标题】:strange syntax error in python, version 2.6 and 3.1python 2.6 和 3.1 版中出现奇怪的语法错误
【发布时间】:2011-02-27 22:34:38
【问题描述】:

这可能不是python惊天动地的不足,但我还是 想知道以下行为背后的基本原理:当我 运行

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__' 子句的存在与否应该 不要在句法层面改变对酸的解释。

任何人都可以重现上述问题,和/或评论 现象?

干杯

【问题讨论】:

  • 我能够重现它。奇怪 - 我也对答案感兴趣。
  • 转载于 2.6.1。这对我来说似乎也是一个错误,但这是一个非常极端的情况。
  • 您可以将“更新”作为答案并接受。
  • 你可以称它为边缘案例,但它确实有能力成为一个展示停止者,直到激烈的头部抓挠和摸索让你继续你的日常工作;只要修复它是值得的。这里的问题是它是如此晦涩难懂,很难用谷歌搜索。
  • 您找到了解决方案!对你有好处,但问题是“卡住”,没有答案。也许您可以将解决方案发布为您自己问题的答案,然后再接受? :)

标签: python python-3.x


【解决方案1】:

更新

事实证明这确实是http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9 指出的错误;错误报告位于http://bugs.python.org/issue1184112;它似乎已在 2.7 和 3.2 中修复。

解决方案

一旦被识别,这个错误就非常容易修复:因为当一个换行符被添加到源文本时,一个有效的 Python 源代码应该在语法上保持有效并且在语义上保持不变,只需机械地对任何源文本执行此操作。这让我想起了 ; 分号,您在组装多文件 javascript 源代码以高效地压缩交付到远程客户端时,机械地放在源文本之间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多