1

我正在阅读瓶子源代码并查看:

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

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

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

提前致谢。

4

1 回答 1

3

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

就像文档说的:

编译(源,文件名,模式[,标志[,dont_inherit]])

文件名参数应该给出读取代码的文件;如果不是从文件中读取,则传递一些可识别的值(通常使用“<字符串>”)。

在没有从文件中读取的情况下source(如这里),他们建议您使用<string>,以便您知道此代码是从写入的字符串编译的。


编写代码的人是在修复一些Bottle Python 2/3 错误时完成的。所以我猜他用<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
于 2013-06-22T05:13:35.913 回答