我正在阅读 bottle 源代码并查看:
eval(compile('def _raise(*a): raise a[0], a[1], a[2]', '<py3fix>', 'exec'))
我阅读了有关compile
的文档,但它只告诉我<string>
是常用的。我也在stackoverflow上搜索和搜索,但无法找到相关信息。
那么有谁能告诉我<py3fix>
如何影响编译?还有其他文件名,我在哪里可以找到相关文档?
提前致谢。
答案 0 :(得分:3)
它根本不会影响它。它只是一个名称,用于标识编译代码的来源,因此您可以使用所需的字符串。
就像文档说的那样:
compile(source,filename,mode [,flags [,dont_inherit]])
filename参数应该给出代码所在的文件 读;如果没有从文件中读取,则传递一些可识别的值 ('&lt; string&gt;'常用)。
如果没有从文件中读取source
(如此处),他们建议您使用<string>
,以便您知道此代码是从写入的字符串编译的。
评论代码的人在修复某些Bottle Python 2/3 bugs时就这样做了。所以我猜他用<py3fix>
作为一种方法来识别断言是从用户运行时编译的def _raise
中提出的:2.x:
>>> 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