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

les*_*lie 633 python python-2.x

包括我在内的人都知道Python中有一些东西叫它__future__,它出现在我读过的很多模块中.像我这样沉闷的人不知道它为什么存在,以及如何/何时使用它,即使在阅读了Python的__future__文档之后.

那么用示例来解释一下吗?

在基本用法方面,我快速得到了一些答案,看起来都是正确的.

但是,为了进一步了解如何__future__工作:

当我试图理解它时,我刚刚意识到一个让我感到困惑的关键事情,那就是当前的python版本如何包含将在未来版本中发布的内容?如何在当前的python版本中成功编译未来python版本中使用新功能的程序?

所以,我想现在,当前版本已经打​​包了一些潜在的功能,将包含在未来的版本中 - 这是对的吗?但这些功能只能通过__future__,因为它还没有成为标准 - 我是对的吗?

glg*_*lgl 350

随着__future__模块的包含,您可以慢慢习惯于不兼容的更改或引入新关键字的更改.

例如,对于使用上下文管理器,您必须from __future__ import with_statement在2.5中执行,因为with关键字是新的,不应再用作变量名.为了能够使用使用命名变量的程序,with需要上面的import语句.

另一个例子是

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1
Run Code Online (Sandbox Code Playgroud)

没有这些__future__东西,两个print陈述都会打印出来1.

内部差异是没有导入,/映射到__div__()方法,而使用它__truediv__().(无论如何,//电话__floordiv__().)

提议print:print成为3.x中的函数,失去其作为关键字的特殊属性.所以它反过来了.

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记`from __future__ import braces`:p (139认同)
  • @zoogleflatt如果你更像一个标签人,你不知道PEP 8.强烈建议*不*使用标签... (13认同)
  • @glglgl从技术上讲,它只是说它们是首选.在阅读了为什么这是完全正确之后我并不完全清楚,我猜这是为了使缩进级别完全匹配以使代码更整洁? (5认同)
  • @zoogleflatt这肯定也与大多数人使用4个空格进行1级缩进的事实有关,为了兼容性原因,一个标签相当于8个空格,并且不鼓励混合标签和空格(相反,AFAIK,甚至不允许使用PY3) (4认同)

agf*_*agf 180

当你这样做

from __future__ import whatever
Run Code Online (Sandbox Code Playgroud)

你实际上并没有使用import声明,而是使用未来声明.您正在阅读错误的文档,因为您实际上并未导入该模块.

将来的语句很特殊 - 它们会改变Python模块的解析方式,这就是为什么它们必须位于文件的顶部.它们为文件中的单词或符号赋予新的或不同的含义.来自文档:

未来的声明是编译器的一个指令,即应该使用将在Python的指定未来版本中提供的语法或语义来编译特定模块.未来的声明旨在简化向未来版本的Python的迁移,从而引入对语言的不兼容更改.它允许在功能成为标准版本之前,在每个模块的基础上使用新功能.

如果您确实想要导入__future__模块,那就行了

import __future__
Run Code Online (Sandbox Code Playgroud)

然后像往常一样访问它.

  • 从技术上讲,它也是一个import语句,因为相关名称绑定到局部变量.`from __future__ import print_function`既改变了`print`关键字的行为又具有等同于'print_function = __import __("__ future __")的运行时效果.print_function` (3认同)

Cod*_*ist 108

__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)
Run Code Online (Sandbox Code Playgroud)

  • 它有点类似于浏览器世界中的polyfill (4认同)
  • 因此,根据变量中的发行版本,如果您的解释器使用的版本比指示的版本更高,则“import __future__ xyz”是无操作? (2认同)

Mih*_*eac 45

它可用于使用较新版本中出现的功能,同时具有旧版本的Python.

例如

>>> from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)

将允许您print作为功​​能使用:

>>> print('# of entries', len(dictionary), file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)


Rob*_*man 26

已经有一些很好的答案,但它们都没有解决__future__语句当前支持的完整列表.

简而言之,__future__语句强制Python解释器使用该语言的新功能.

它目前支持的功能如下:

nested_scopes:

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

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
Run Code Online (Sandbox Code Playgroud)

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

generators:

引入了生成器函数,例如下面的函数,用于在连续的函数调用之间保存状态:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

代替:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END
Run Code Online (Sandbox Code Playgroud)

要么:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
Run Code Online (Sandbox Code Playgroud)

with_statement:

在Python中添加语句"with"作为关键字,以消除对try/finally语句的需要.这种情况的常见用途是在执行文件I/O时,例如:

with open('workfile', 'r') as f:
     read_data = f.read()
Run Code Online (Sandbox Code Playgroud)

print_function:

强制使用Python 3括号样式print函数调用而不是print MESSAGE样式print语句.

unicode_literals:

介绍bytes对象的文字语法.这意味着语句bytes('Hello world', 'ascii')可以简单地表达为b'Hello world'.

generator_stop:

替换使用StopIteration生成器函数内部RuntimeError异常的例外.

上面没有提到的另一个用途是该__future__语句还强制使用Python 2.1+解释器,因为使用旧版本会引发运行时异常.

参考文献:

  • @MohsenHaddadi future 语句有点像一个功能标志...当 Python 接受某些功能来改变现有程序的行为(例如真正的除法)时,首先您可以使用 future 语句启用它们,并且然后在*未来*版本中它们将成为该语言的永久功能。因此得名“__future__”。我相信,这种尽早选择重大变更的能力旨在帮助现有计划在重大变更全面生效之前及时过渡。 (3认同)
  • 假设您处于离线状态,python 如何知道未来版本是否可用?如果您的计算机上没有安装未来版本的python,它如何使用未来的功能? (2认同)
  • 我认为这是最好的答案。尤其是答案的开头,“强制”使用“更新的功能”。 (2认同)

Pra*_*aym 24

或者它是说"因为这是python v2.7,使用不同的'print'函数,它已添加到python v2.7,在python 3中添加后.所以我的'print'将不再是语句(例如打印"message")但是函数(例如print("message",options).那样当我的代码在python 3中运行时,'print'不会中断."

from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)

print_function是包含'print'新实现的模块,根据它在python v3中的行为方式.

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