我如何知道在 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__
编译指示?
我想这样做的原因是我维护的一些遗留代码有条件地在 eval
ing/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'
当我使用 from __future__ import X
语句(例如 from __future__ import unicode_literals
)在 Python 2 中启用解释器功能时,解释器行为从此发生变化。
有没有办法在运行时确定在给定的执行点启用了哪些 __future__
编译指示?
我想这样做的原因是我维护的一些遗留代码有条件地在 eval
ing/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'