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)
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)
然后像往常一样访问它.
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)
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+解释器,因为使用旧版本会引发运行时异常.
参考文献:
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
| 归档时间: |
|
| 查看次数: |
262648 次 |
| 最近记录: |