我如何知道在 Python 程序运行时启用了来自“__future__”的哪些编译指示?

How can I tell what pragmas from '__future__' have been enabled at runtime in a Python program?

当我使用 from __future__ import X 语句(例如 from __future__ import unicode_literals)在 Python 2 中启用解释器功能时,解释器行为从此发生变化。

有没有办法在运行时确定在给定的执行点启用了哪些 __future__ 编译指示?

我想这样做的原因是我维护的一些遗留代码有条件地在 evaling/runtime-importing 其他任意代码之前启用一些 __future__ 编译指示。在调试该代码中的行为问题时,我想检查是否因为某些条件 __future__ 导入已被触发。我知道有条件地导入 __future__ (或在入口点顶部以外的任何地方导入)是一种反模式,并且没有传播它的计划;我只想调试执行此操作的代码。

我试过检查 sys.modules,使用它我可以知道 __future__ 中的 something 已经被导入,因为 __future__模块出现在已经导入的列表中。但是,这只是 __future__ 模块 ,并且解释器行为更改未作为子模块实现,因此我看不到哪些已启用。

您可以只看文件的顶部,因为 __future__ 导入是在那里定义的,它们不能在其他任何地方。

此外,解释器 没有像您暗示的那样全局更改 __future__ 更改仅适用于其中包含实际 __future__ 导入的模块。因此,如果您的项目中有两个 .py 文件,并且其中只有一个具有 from __future__ import unicode_literals,那么只有 那个文件 将具有 unicode 文字。另一个文件仍将具有正常文字。

下面的测试已经在python 2.7:

中执行

file1.py:

from __future__ import unicode_literals
x = 'This is unicode'

file2.py

y = 'This is NOT unicode'

测试:

>>> import file1
>>> import file2
>>> file1.x, type(file1.x)
(u'This is unicode', <type 'unicode'>)
>>> file2.y, type(file2.y)
('This is NOT unicode', <type 'str'>)

这意味着功能存储 每个模块 而不是全局存储。您可以检查模块对象的功能属性:

>>> file1.unicode_literals
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)
>>> file2.unicode_literals
AttributeError: 'module' object has no attribute 'unicode_literals'