Python中的__future__是什么,以及如何/什么时候使用它以及如何工做

__future__常常出如今Python模块中。 即便阅读了Python的__future__文档,我也不了解__future__是什么__future__以及如何/什么时候使用它。 html

有人能够举例说明吗? node

关于我收到的__future__的基本用法的一些答案彷佛是正确的。 python

可是,我还须要了解有关__future__工做原理的另外一件事: 程序员

对我来讲,最使人困惑的概念是当前的python版本如何包含将来版本的功能,以及如何使用当前版本的Python成功地编译使用将来版本的功能的程序。 函数

我猜测当前版本包含了未来的潜在功能。 可是,这些功能仅可经过使用__future__来使用,由于它们不是当前标准。 让我知道我是否正确。 spa


#1楼

仍是说“因为这是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


#2楼

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

#3楼

我发现很是有用的用途之一是__future__模块中的print_function

在Python 2.7中,我但愿未来自不一样打印语句的字符打印在同一行上而没有空格。

能够在最后使用逗号(“,”)来完成此操做,可是它还会附加一个额外的空间。 上面的语句用做:

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

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


#4楼

从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循环时,它将在下一行上打印*。


#5楼

已经有一些不错的答案,可是没有一个能解决__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+解释器,由于使用较旧的版本将引起运行时异常。

参考文献:

相关文章
相关标签/搜索