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

谁能举例解释一下吗?

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

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

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

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


当前回答

已经有了一些很好的答案,但没有一个解决了__future__语句目前支持的内容的完整列表。

简单地说,__future__语句迫使Python解释器使用该语言的新特性。


目前支持的特性如下:

nested_scopes

在Python 2.1之前,以下代码将引发NameError:

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

from __future__ import nested_scopes指令将允许启用此功能。

发电机

引入了如下的生成器函数来保存连续函数调用之间的状态:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

部门

Python 2中使用经典除法。x版本。这意味着一些除法语句返回除法的合理近似值(“真除法”),而另一些则返回floor(“floor除法”)。从Python 3.0开始,true除法由x/y指定,而floor除法由x//y指定。

from __future__导入除法指令强制使用Python 3.0风格的除法。

absolute_import

允许用圆括号括起多个import语句。例如:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

而不是:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Or:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

with_statement

在Python中作为关键字添加语句with,以消除对try/finally语句的需求。它的常见用途是在执行文件I/O时,例如:

with open('workfile', 'r') as f:
     read_data = f.read()

print_function:

强制使用Python 3圆括号样式的print()函数调用,而不是print MESSAGE样式语句。

unicode_literals

为bytes对象引入文字语法。这意味着像bytes('Hello world', 'ascii')这样的语句可以简单地表示为b'Hello world'。

generator_stop

将生成器函数内部使用的StopIteration异常替换为RuntimeError异常。

上面没有提到的另一个用途是__future__语句也需要使用Python 2.1+解释器,因为使用旧版本会抛出运行时异常。


参考文献

https://docs.python.org/2/library/future.html https://docs.python.org/3/library/future.html https://docs.python.org/2.2/whatsnew/node9.html https://www.python.org/dev/peps/pep-0255/ https://www.python.org/dev/peps/pep-0238/ https://www.python.org/dev/peps/pep-0328/ https://www.python.org/dev/peps/pep-3112/ https://www.python.org/dev/peps/pep-0479/

其他回答

__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)

在Python 3.0之后,print不再只是一个语句,而是一个函数。并包含在PEP 3105中。

此外,我认为Python 3.0包仍然具有这些特殊的功能。让我们通过Python中传统的“金字塔程序”来看看它的可用性:

from __future__ import print_function

class Star(object):
    def __init__(self,count):
        self.count = count

    def start(self):
        for i in range(1,self.count):
            for j in range (i): 
                print('*', end='') # PEP 3105: print As a Function 
            print()

a = Star(5)
a.start()

Output:
*
**
***
****

如果我们使用普通的print函数,我们将无法实现相同的输出,因为print()带有一个额外的换行符。所以每次内部的for循环执行时,它都会将*打印到下一行。

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

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

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

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

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

已经有了一些很好的答案,但没有一个解决了__future__语句目前支持的内容的完整列表。

简单地说,__future__语句迫使Python解释器使用该语言的新特性。


目前支持的特性如下:

nested_scopes

在Python 2.1之前,以下代码将引发NameError:

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

from __future__ import nested_scopes指令将允许启用此功能。

发电机

引入了如下的生成器函数来保存连续函数调用之间的状态:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

部门

Python 2中使用经典除法。x版本。这意味着一些除法语句返回除法的合理近似值(“真除法”),而另一些则返回floor(“floor除法”)。从Python 3.0开始,true除法由x/y指定,而floor除法由x//y指定。

from __future__导入除法指令强制使用Python 3.0风格的除法。

absolute_import

允许用圆括号括起多个import语句。例如:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

而不是:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Or:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

with_statement

在Python中作为关键字添加语句with,以消除对try/finally语句的需求。它的常见用途是在执行文件I/O时,例如:

with open('workfile', 'r') as f:
     read_data = f.read()

print_function:

强制使用Python 3圆括号样式的print()函数调用,而不是print MESSAGE样式语句。

unicode_literals

为bytes对象引入文字语法。这意味着像bytes('Hello world', 'ascii')这样的语句可以简单地表示为b'Hello world'。

generator_stop

将生成器函数内部使用的StopIteration异常替换为RuntimeError异常。

上面没有提到的另一个用途是__future__语句也需要使用Python 2.1+解释器,因为使用旧版本会抛出运行时异常。


参考文献

https://docs.python.org/2/library/future.html https://docs.python.org/3/library/future.html https://docs.python.org/2.2/whatsnew/node9.html https://www.python.org/dev/peps/pep-0255/ https://www.python.org/dev/peps/pep-0238/ https://www.python.org/dev/peps/pep-0328/ https://www.python.org/dev/peps/pep-3112/ https://www.python.org/dev/peps/pep-0479/

__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属性中。