__future__经常出现在Python模块中。即使在阅读了Python的__future__文档之后,我也不明白__future__是用于什么以及如何/何时使用它。

谁能举例解释一下吗?

我收到的一些关于__future__的基本用法的回答似乎是正确的。

然而,我需要了解关于__future__如何工作的另一件事:

最令我困惑的概念是,当前的python版本如何包含未来版本的特性,以及使用未来版本特性的程序如何在当前版本的python中成功编译。

我猜当前的发行版中包含了未来的潜在特性。然而,这些特性只能通过使用__future__才能使用,因为它们不是当前的标准。如果我是对的,请告诉我。


当前回答

__future__是一个python模块。添加它是为了避免混淆现有的工具,这些工具分析导入语句并希望找到它们正在导入的模块。它是在2.1版本中添加的,因此如果在2.1版本之前使用__future__,导入将失败。

现在看看这段代码:

>>> from __future__ import division
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)

以_Feature(OptionalRelease, MandatoryRelease, CompilerFlag)格式返回的除法。OptionalRelease和MandatoryRelease都是5元组,形式为:

(
 PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)

所以在我们的例子中,OptionalRelease是2.2.0a2, MandatoryRelease是3.0.0a0。

OptionalRelease告诉我们特性被接受的第一个版本。

MandatoryRelease预测该特性何时成为语言的一部分或显示该特性何时成为语言的一部分;在这之后的版本中,模块不再需要future语句来使用相关特性,但可以继续使用这样的导入。如果MandatoryRelease为None,则计划的特性将被删除。

CompilerFlag是(位字段)标志,应该在第四个参数中传递给内置函数compile()以启用动态编译代码中的特性。该标志存储在_Feature实例的compiler_flag属性中。

其他回答

或者就像说“因为这是python v2.7,使用不同的'print'函数,该函数在python 3中添加后也添加到python v2.7中。”所以我的“打印”将不再是语句(例如打印“message”),而是函数(例如,打印(“message”,选项)。这样,当我的代码在python3中运行时,'print'就不会中断。”

In

from __future__ import print_function

Print_function模块包含'print'的新实现,就像它在python v3中的行为一样。

这里有更多解释:http://python3porting.com/noconv.html

我发现非常有用的一个用法是__future__模块中的print_function。

在Python 2.7中,我希望将来自不同print语句的字符打印在不带空格的同一行上。

可以在结尾使用逗号(“,”),但也会附加一个额外的空格。 以上语句用作:

from __future__ import print_function
...
print (v_num,end="")
...

这将在不带空格的单行中打印每次迭代的v_num值。

通过__future__模块的包含,你可以慢慢地习惯不兼容的更改或引入新的关键字。

例如,对于使用上下文管理器,你必须在2.5中执行from __future__ import with_statement,因为with关键字是新的,不应该再用作变量名。为了在Python 2.5或更高版本中使用with作为Python关键字,您将需要使用上面的导入。

另一个例子是

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1

如果没有__future__这个东西,两个print语句都将输出1。

内部区别在于,如果没有导入,/将被映射到__div__()方法,而有了导入,将使用__truediv__()方法。(在任何情况下,//调用__floordiv__()。)

恰当的打印:打印成为3中的一个函数。X,失去它作为关键字的特殊属性。所以情况正好相反。

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>

当你这样做时

from __future__ import whatever

实际上使用的不是import语句,而是future语句。您正在阅读错误的文档,因为您实际上没有导入该模块。

Future语句很特殊——它们改变了Python模块的解析方式,这就是为什么它们必须位于文件顶部的原因。它们为文件中的单词或符号赋予新的或不同的含义。从文档中可以看出:

future语句是向编译器发出的指令,指示应该使用特定的Python未来版本中可用的语法或语义来编译特定的模块。future语句旨在简化向Python引入不兼容更改的未来版本的迁移。它允许在每个模块的基础上使用新特性,在该特性成为标准的版本之前。

如果你真的想导入__future__模块,就这么做吧

import __future__

然后像往常一样访问它。

它可以用来使用在较旧版本的Python中出现的新版本的特性。

例如

>>> from __future__ import print_function

将允许您使用print作为函数:

>>> print('# of entries', len(dictionary), file=sys.stderr)