What is __future__ in Python used for and how/when to use it, and how it works
包括我在内的人都知道在python中有一种叫做
有没有用实例来解释?
在基本用法方面,我很快得到了一些答案,看起来都是正确的。
但是,为了进一步了解
我刚刚意识到一个关键的事情,当我试图理解它时,我很困惑,那就是,当前的Python版本如何包含将在未来版本中发布的内容?在未来的python版本中,如何使用新特性的程序能够被当前的python版本成功编译?
所以,我想现在,当前版本已经打包了一些潜在的特性,这些特性将包含在未来的版本中,这是正确的吗?但是这些功能只能由
随着
例如,对于使用上下文管理器,您必须在2.5中执行
另一个例子是
1 2 3 | from __future__ import division print 8/7 # prints 1.1428571428571428 print 8//7 # prints 1 |
没有
内部差异是,如果没有导入,
命题
1 2 3 4 5 6 | >>> print >>> from __future__ import print_function <built-in function print> >>> |
当你这样做的时候
1 | from __future__ import whatever |
您实际上并没有使用
未来的语句是特殊的——它们改变了Python模块的解析方式,这就是它们必须位于文件顶部的原因。它们给文件中的单词或符号赋予了新的或不同的含义。来自文档:
A future statement is a directive to the compiler that a particular module should be compiled using syntax or semantics that will be available in a specified future release of Python. The future statement is intended to ease migration to future versions of Python that introduce incompatible changes to the language. It allows use of the new features on a per-module basis before the release in which the feature becomes standard.
如果您确实想导入
1 | import __future__ |
然后像往常一样进入。
1 2 3 | >>> import __future__ >>> __future__.division _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192) |
它可以用于使用将在较新版本中出现的功能,同时使用较旧版本的Python。
例如
1 | >>> from __future__ import print_function |
将允许您使用
1 | >>> print('# of entries', len(dictionary), file=sys.stderr) |
或者像是说"既然这是Python2.7,那么在Python3中添加它之后,使用同样添加到Python2.7中的不同"print"函数。所以我的"print"不再是语句(如print"message"),而是函数(如print("message",options)。这样,当我的代码在python 3中运行时,"print"就不会中断。"
在
1 | from __future__ import print_function |
print_函数是包含"print"的新实现的模块,根据它在Pythonv3中的行为方式。
这有更多的解释:http://python3porting.com/noconv.html
已经有了一些很好的答案,但没有一个能给出
简单地说,"未来"语句强制Python解释器使用该语言的新特性。
它当前支持的功能如下:
在Python2.1之前,以下代码将引发一个名称错误:
1 2 3 4 5 6 | def f(): ... def g(value): ... return g(value-1) + 1 ... |
为在连续函数调用之间保存状态,引入了如下生成器函数:
1 2 3 4 5 | def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b |
Python2.x版本中使用了经典的除法。这意味着一些除法语句返回除法的合理近似值("真除法"),而其他语句返回楼层("楼层除法")。从python 3.0开始,真正的划分由
允许括号括起多个
1 2 | from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END) |
而不是:
1 2 | from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \ LEFT, DISABLED, NORMAL, RIDGE, END |
或:
1 2 | from Tkinter import Tk, Frame, Button, Entry, Canvas, Text from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END |
在python中添加语句"with"作为关键字,以消除对
1 2 | with open('workfile', 'r') as f: read_data = f.read() |
强制使用python 3圆括号样式的
介绍
将在生成器函数内部使用的
上面没有提到的另一个用法是
参考文献:
- 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/
我发现非常有用的一种用途是来自
在python 2.7中,我希望不同的打印语句中的字符在同一行上不带空格地打印。
它可以在末尾使用逗号(",")来完成,但它还附加了一个额外的空格。上述声明用作:
1 2 3 4 | from __future__ import print_function ... print (v_num,end="") ... |
这将在一行中打印每个迭代的
显式优于隐式
1 2 3 | from __future__ import braces File"<stdin>", line 1 SyntaxError: not a chance |
[学分:@mdeous]
在python 3.0之后,print不再只是一个语句,而是一个函数。并包含在PEP 3105中。
另外,我认为python 3.0包仍然具有这些特殊的功能。让我们通过Python中的传统"金字塔程序"来了解其可用性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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循环时,它都会将*打印到下一行。