python - 我们如何才能使 __future__ 进口全局化?

标签 python python-2.7

规范:Python 2.7

我正在开发一个包含多个模块的项目,我想在所有模块中激活 __future__ 模块的一些功能。我想在一个模块上导入我需要的所有功能,然后将该单个模块导入到每个其他模块,并让这些功能在所有模块中处于事件状态,或者达到那种效果。

我试过:

[A.py]

from __future__ import division

[B.py]

import A
print(1/2)

运行 B.py 除法仍然是整数。我试过:

[A.py]

print(1/2)

[B.py]

from __future__ import division
import A

运行 B.py 给出了相同的结果。对于前面的两个示例,我还尝试将“导入 A”切换为“从 A 导入 *”,结果相同。

我在 Google 上搜索了一段时间,并在 Python 文档中找到了关于 __future__ 模块如何工作的最佳描述,这显然足够了。在那里,我只能找到这些功能将在它们被导入到的模块中处于事件状态的保证,而没有提及如何在全局范围内执行此操作。

所以我想知道是否有办法做到这一点,可以是我描述的方式,也可以是创建某种运行时配置文件,也可以是通过其他方式。

最佳答案

没有办法用语言来做到这一点;从这个意义上说,你真的不能让 __future__ 导入全局。 (好吧,你可能可以用围绕 imp 或其他东西的复杂的东西替换普通的 import 语句。请参阅 Future statement 文档并向下滚动到“由...编译的代码”但是类似这样的事情几乎肯定是个坏主意。)

原因是 from __future__ import division 并不是真正的正常导入。或者,更确切地说,它不仅仅是一个正常的导入。实际上,您确实获得了一个名为division 的名称,您可以检查它,但仅仅拥有该值没有任何效果——因此将它传递给其他模块不会影响那些模块。在正常导入之上,Python 具有特殊的魔力,可以检测模块顶部或交互式解释器中的 __future__ 导入,并更改代码的编译方式。参见 future对于“真正的进口”部分,Future statements对于“魔法”部分,如果您需要所有详细信息。

并且没有配置文件可以让您执行此操作。但是有一个命令行参数:

python -Qnew main.py

这与在任何地方执行 from __future__ import division 具有相同的效果。

您可以将其添加到 #! 行,或 alias pyfuturediv='python -Qnew'(甚至 alias python='python -Qnew' ) 在你的 shell 中,或者其他什么,它可能和你的目的的配置文件一样好。

但实际上,如果您想确保模块 B 获得新式划分,您可能应该首先在 B 中声明 __future__

或者,当然,您可以只为 Python 3.0+ 而不是 2.3-2.7 编写。 (请注意,一些核心开发人员反对使用命令行参数,因为“全局获取功能 X 的正确方法是使用 Python 版本 >= 功能 X 的 MandatoryRelease”。)或使用 // 当你的意思是 // 时。

另一种可能性是使用 six ,一个旨在让您编写几乎与 Python 3.3 类似的代码并使其在 2.4-2.7(和 3.0-3.2)中正常工作的模块。例如,您没有得到 print 函数,但得到了一个工作完全相同的 print_ 函数。您不会获得 Unicode 文字,但会获得 u() 假文字 — 连同源代码中的 UTF-8 编码声明,几乎已经足够好了。它还提供了很多你无法从 __future__ 获得的东西——StringIOBytesIOexec 作为函数,next 函数等。

如果问题是你有 1000 个源文件,并且编辑它们很痛苦,你可以使用 sed,或者使用 3to2修复除法,或者……

关于python - 我们如何才能使 __future__ 进口全局化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773861/

相关文章:

python - 导入错误 : cannot import name 'LEMMA_INDEX' from 'spacy.lang.en'

python - Pygame 和 Sprite 的旋转

python - bool 索引但结果是其他一些操作

python - 在没有列表理解的情况下在 Python 中提取包含字符串的列表项?

python - 线程不适用于多个连接

python - 无法加载tensorflow

python - 如何用递归替换嵌套的 for 循环?

python - Zbar 树莓派安装

python-2.7 - 执行命令“OSError: [Errno 8] Exec format error”时“ambari-server setup”

python-2.7 - python wand.image 无法识别