Python如何处理“from __future__ import division”?

3

我已经查看了__future__.py的源代码,但是它对我来说毫无意义——它如何实际改变除法的行为?


2
我的猜测是compiler_flag可能会向编译器发出信号,要求改变除法。 - Natecat
有趣...也许我真的不理解import的工作原理;我以为它会评估相关模块,然后创建一个模块对象,可以完整地或通过单个属性(from xyz import abc)引入命名空间范围。但是看到__future__.py,似乎如果该模块被评估,则应启用所有功能。from __future__ import XYZ如何挑选在__future__.py中创建对象? - Jason S
1个回答

4

这个模块只是为了记录和内省而存在,它里面所有的代码实际上并不执行任何操作。

在编译一个模块时,Python会调用PyFuture_FromAST来检查from __future__ import语句是否有效,如果有效,就会在PyFutureFeatures对象上设置相应的标志。然后编译器会在编译模块之前去将那些标志设置到编译器上下文中,最后才进行实际的编译。

相比之下,在Python 3中,__future__.py仍然是一样的,包含所有相同的信息,但在future.c中,没有任何特性设置任何标志,因为所有这些特性在Python 3中默认启用。


注意:所有行号链接在我编写此文时都是准确的。我无法弄清楚如何让hgweb链接到特定的修订版本,以便它们在未来不会失效。如果有人想编辑链接使其更加永久,请随意。 - hobbs
那么Python解释器实际上知道from __future__ import xyz并对其进行特殊处理(与from ordinary_module import xyz不同)吗? - Jason S
@JasonS 正确。这就像其他语言中的编译器指令或预处理指令。 - hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接