规格: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__模块如何工作的最佳描述。在那里,我只能找到这些功能在导入模块中有效的保证,而没有提及如何在全局范围内进行。
所以我想知道是否有办法这样做,无论是我描述的方式,还是创建某种运行时配置文件,或者通过其他方式。
答案 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__
得到的东西 - StringIO
和BytesIO
,exec
作为一个函数,next
功能等。
如果问题是您有1000个源文件,而且编辑它们很麻烦,您可以使用sed
,或仅使用3to2
选项修复分区,或者...... < / p>
答案 1 :(得分:0)
另一种方法是使用isort。 isort
具有-a
命令行标志,用于将导入添加到您指定的文件。只运行不带参数的isort
将以递归方式运行当前工作目录和所有子目录中的所有python文件。
如果像我一样,你在该文件夹中有一个虚拟环境,并且正在使用git(或者只有列出你文件的等效方式),并且不想在该虚拟环境中的所有文件上运行它,你可以使用类似的东西:
git ls-tree -r HEAD --name-only | grep "\.py$" | xargs isort -a -y "from __future__ import division"