我正在阅读瓶子的源代码,请参阅:

eval(compile('def _raise(*a): raise a[0], a[1], a[2]', '<py3fix>', 'exec'))


我阅读了有关compile的文档,它仅告诉我<string>是常用的。我也用Google搜索和搜索stackoverflow,但是找不到相关信息。

那么谁能告诉我<py3fix>如何影响编译?还有其他文件名,在哪里可以找到相关文档?

提前致谢。

最佳答案

它根本不影响它。它只是一个名称,用于标识编译代码的来源,因此您可以使用所需的字符串。

就像文档说的那样:


  编译(源,文件名,模式[,标志[,dont_inherit]])
  
  filename参数应提供代码所在的文件
  读;如果未从文件中读取,则传递一些可识别的值
  (通常使用“ ”)。


在未从文件中读取source的情况下(如此处),他们建议您使用<string>,以便您知道此代码是从书面字符串编译而成的。



提交代码的人在修复某些Bottle Python 2/3 bugs时做到了。所以我猜想他使用<py3fix>来标识断言是从用户运行2.x时编译的def _raise引发的:

>>> eval(compile('def _raise(*a): raise a[0], a[1], a[2]', '<py3fix>', 'exec'))
>>> _raise(Exception, "error message", None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<py3fix>", line 1, in _raise
Exception: error message

>>> eval(compile('def _raise(*a): raise a[0], a[1], a[2]', '<my_source_file>', 'exec'))
>>> _raise(Exception, "error message", None)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<my_source_file>", line 1, in _raise
Exception: error message

08-24 13:46