我们怎样才能使__future__全球进口?

xor*_*xor 16 python python-2.7

规格:Python 2.7

我正在开发一个包含多个模块的项目,我想在所有模块中激活__future__模块中的一些功能.我想在一个模块上导入我需要的所有功能,然后将该单个模块导入到所有其他模块中,并使这些功能在所有模块中都处于活动状态,或者具有相应的效果.

我试过了:

[A.py]

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

[B.py]

import A
print(1/2)
Run Code Online (Sandbox Code Playgroud)

运行B.py分区仍然是整数.我试过了:

[A.py]

print(1/2)
Run Code Online (Sandbox Code Playgroud)

[B.py]

from __future__ import division
import A
Run Code Online (Sandbox Code Playgroud)

运行B.py给出了相同的结果.在前面两个例子中,我也尝试用'from a import*'切换'import A',结果相同.

我搜索了Google一段时间,并在Python文档中找到了关于__future__模块如何工作的最佳描述.在那里,我只能找到确保功能在导入模块中处于活动状态的保证,而没有提及如何在全局范围内执行此功能.

所以我想知道是否有这样做的方式,无论是我描述的方式,还是创建某种运行时配置文件,或通过其他方式.

aba*_*ert 15

用语言无法做到这一点; __future__从这个意义上讲,你真的不能让进口全球化.(好吧,你可能可以import用一些复杂的东西替换正常的语句imp.看看Future语句文档并向下滚动到"由......编译的代码"但是这样的事情几乎肯定是个坏主意.)

原因是这from __future__ import division不是一个正常的导入.或者说,它不仅仅是正常的导入.实际上,您确实获得了一个division可以检查的名称,但只是具有该值无效 - 因此将其传递给其他模块不会影响这些模块.除了正常导入之外,Python还具有特殊的魔力,可以检测__future__模块顶部或交互式解释器中的导入,并更改代码编译的方式.见未来 "真正的进口"的一部分,未来的陈述为"神奇"的一部分,如果你想所有的细节.

而且没有配置文件可以让你这样做.但是有一个命令行参数:

python -Qnew main.py
Run Code Online (Sandbox Code Playgroud)

这与在任何from __future__ import division地方做同样的效果.

您可以将它添加到#!行中,或者alias pyfuturediv='python -Qnew'(或者甚至alias python='python -Qnew')添加到shell中,或者其他任何内容,这可能与配置文件一样好.

不过说真的,如果你想确保模块B获取新的风格划分,你可能应该__future__摆在首位B中声明.

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

另一种可能性是使用六个模块,这个模块旨在让您编写几乎Python 3.3的代码,并使其在2.4-2.7(和3.0-3.2)中正常工作.例如,你没有得到一个print函数,但你确实得到了一个print_完全相同的函数.你没有获得Unicode文字,但你得到u()假文字 - 它与源中的UTF-8编码声明一起,几乎足够好.它提供了一大堆的东西,你不能从获得__future__的良好StringIOBytesIO,exec作为一个功能,该next功能等

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

  • +1 - 关键点是`from __future__ import [foo]`根本不是一个import语句; 它是[未来声明](http://docs.python.org/2/reference/simple_stmts.html#future-statements),它在编译时有效. (5认同)