__future__
常常出如今Python模块中。 即便阅读了Python的__future__
文档,我也不了解__future__
是什么__future__
以及如何/什么时候使用它。 html
有人能够举例说明吗? node
关于我收到的__future__
的基本用法的一些答案彷佛是正确的。 python
可是,我还须要了解有关__future__
工做原理的另外一件事: 程序员
对我来讲,最使人困惑的概念是当前的python版本如何包含将来版本的功能,以及如何使用当前版本的Python成功地编译使用将来版本的功能的程序。 函数
我猜测当前版本包含了未来的潜在功能。 可是,这些功能仅可经过使用__future__
来使用,由于它们不是当前标准。 让我知道我是否正确。 spa
仍是说“因为这是python v2.7,因此请使用在python 3中添加后也已添加到python v2.7中的那个不一样的'print'函数。所以,个人'print'将再也不是语句(例如,打印“ message”),但具备功能(例如,print(“ message”,选项)。这样,当个人代码在python 3中运行时,“ print”不会中断。” code
在 htm
from __future__ import print_function
print_function是包含“ print”的新实现的模块,具体取决于python v3中的行为。 对象
这有更多解释: http : //python3porting.com/noconv.html ci
__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)
我发现很是有用的用途之一是__future__
模块中的print_function
。
在Python 2.7中,我但愿未来自不一样打印语句的字符打印在同一行上而没有空格。
能够在最后使用逗号(“,”)来完成此操做,可是它还会附加一个额外的空间。 上面的语句用做:
from __future__ import print_function ... print (v_num,end="") ...
这将在v_num
打印每次迭代中的v_num
值, v_num
带空格。
从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()带有额外的换行符。 所以,每次执行内部for循环时,它将在下一行上打印*。
已经有一些不错的答案,可是没有一个能解决__future__
语句当前支持的内容的完整列表。
简而言之, __future__语句会强制Python解释器使用该语言的更新功能。
当前支持的功能以下:
nested_scopes
:
在Python 2.1以前,如下代码将引起NameError :
def f(): ... def g(value): ... return g(value-1) + 1 ...
from __future__ import nested_scopes
指令将容许启用此功能。
generators
:
引入了如下生成器函数,以在连续的函数调用之间保存状态:
def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b
division
:
在Python 2.x版本中使用经典除法。 意味着某些除法语句返回合理的除法近似值(“真除法”),而其余除法语句返回下限(“地板除法”)。 从Python 3.0开始,真除法由x/y
指定,而底除由x//y
指定。
from __future__ import division
指令强制使用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
要么:
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+解释器,由于使用较旧的版本将引起运行时异常。
参考文献: