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

时间:2012-12-08 02:29:10

标签: 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给出了相同的结果。在前面两个例子中,我也尝试用'from a import *'切换'import A',结果相同。

我搜索了Google一段时间,并在Python文档中找到了关于__future__模块如何工作的最佳描述。在那里,我只能找到这些功能在导入模块中有效的保证,而没有提及如何在全局范围内进行。

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

2 个答案:

答案 0 :(得分:15)

没有办法在语言中这样做;在这个意义上,你真的无法使__future__进口全球化。 (好吧,你可能可以用import之类的东西替换正常的imp语句。请参阅Future statement文档并向下滚动到“由......编译的代码”但是这样的东西是几乎肯定是一个坏主意。)

原因是from __future__ import division实际上不是正常导入。或者,它是 正常导入。你实际上得到一个你可以检查的名为division的名称,但只是拥有该值没有效果 - 所以将它传递给其他模块不会影响这些模块。除了正常导入之外,Python还具有特殊的魔力,可以在模块顶部或交互式解释器中检测__future__导入,并更改代码编译的方式。如果您需要所有详细信息,请参阅future了解“真正的导入”部分,Future statements了解“魔术”部分。

并且没有配置文件可以让您这样做。但是有一个命令行参数:

python -Qnew main.py

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

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

但实际上,如果你想确保模块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选项修复分区,或者...... < / p>

答案 1 :(得分:0)

另一种方法是使用isortisort具有-a命令行标志,用于将导入添加到您指定的文件。只运行不带参数的isort将以递归方式运行当前工作目录和所有子目录中的所有python文件。

如果像我一样,你在该文件夹中有一个虚拟环境,并且正在使用git(或者只有列出你文件的等效方式),并且不想在该虚拟环境中的所有文件上运行它,你可以使用类似的东西:

git ls-tree -r HEAD --name-only | grep "\.py$" | xargs isort -a -y "from __future__ import division"