Python中的__future__是什么,如何使用以及工作原理是什么
__future__
在Python模块中经常出现。即使我看了Python的__future__
文档,我还是不太明白__future__
到底是干什么的,以及什么时候该用它。
有没有人能用例子来解释一下?
我收到的一些关于__future__
基本用法的回答似乎是正确的。
不过,我还想了解一个关于__future__
如何工作的事情:
对我来说,最让人困惑的概念是,为什么当前的Python版本会包含未来版本的功能,以及如何在当前版本的Python中成功编译使用未来版本功能的程序。
我猜测当前的版本是打包了未来可能会用到的功能。但是,这些功能只有通过使用__future__
才能使用,因为它们还不是当前的标准。如果我理解得没错,请告诉我。
9 个回答
__future__
是一个伪模块,程序员可以用它来启用一些与当前解释器不兼容的新语言特性。
举个例子,现在计算 11/4
的结果是 2
。如果在执行这个表达式的模块中启用了真正的除法,比如通过以下方式:
from __future__ import division
那么 11/4
的结果就会变成 2.75
。通过导入 __future__
模块并查看它的变量,你可以了解到某个新特性是什么时候首次加入到语言中的,以及它什么时候会成为默认设置:
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
当你执行
from __future__ import whatever
时,其实你并不是在使用一个 import
语句,而是在使用一个未来语句。你可能看错了文档,因为你并没有真正导入那个模块。
未来语句是特别的,它们会改变你的 Python 模块是如何被解析的,所以它们必须放在文件的最上面。它们会给你文件中的某些词或符号赋予新的或不同的意义。根据文档的解释:
未来语句是给编译器的一个指令,告诉它某个模块应该使用在未来某个 Python 版本中可用的语法或语义进行编译。未来语句的目的是为了让你更容易迁移到那些对语言做出不兼容更改的未来版本的 Python。它允许你在特定模块中使用新特性,而不必等到这些特性成为标准的版本发布。
如果你真的想导入 __future__
模块,只需执行
import __future__
然后像平常一样使用它。
通过引入 __future__
模块,你可以慢慢适应一些不兼容的变化,或者是那些引入新关键词的变化。
比如,在使用上下文管理器时,你需要在 Python 2.5 中写 from __future__ import with_statement
,因为 with
这个关键词是新的,不再适合用作变量名。如果你想在 Python 2.5 或更早的版本中把 with
当作关键词使用,就需要使用上面的导入语句。
另一个例子是
from __future__ import division
print 8/7 # prints 1.1428571428571428
print 8//7 # prints 1
如果没有 __future__
的内容,两个 print
语句都会输出 1
。
内部的区别在于,如果没有那个导入,/
会被映射到 __div__()
方法,而有了它,__truediv__()
方法就会被使用。(无论如何,//
都会调用 __floordiv__()
。)
说到 print
:在 Python 3.x 中,print
变成了一个函数,失去了作为关键词的特殊属性。所以情况正好相反。
>>> print
>>> from __future__ import print_function
>>> print
<built-in function print>
>>>