什么是Python中的__future__以及如何使用它,以及它是如何工作的
包括我在内的人知道Python中有一些名为__future__
东西,它出现在我阅读的很多模块中。 像我这样沉闷的人不知道为什么它在那里,以及如何/何时使用它,即使在阅读Python的__future__
文档之后 。
那么用示例来解释一下吗?
我很快就得到了一些答案,就基本用法而言,这些答案看起来都是正确的。
不过也为了进一步理解__future__
是如何工作的:
当我试图理解这一点时,我意识到了一个令我困惑的关键问题,那就是当前的Python版本是如何包含将来发布的版本的呢? 以及如何在未来的Python版本中使用新function的程序能够被当前的Python版本成功编译?
所以,现在我猜,目前的版本已经打包了一些潜在的function,将包括在未来的版本中 – 这是正确的吗? 但是这些function只能由__future__
,这是因为它还没有成为标准,对吗?
通过添加__future__
模块,您可以慢慢适应不兼容的变化,或者引入新的关键字。
例如,对于使用上下文pipe理器,您必须from __future__ import with_statement
2.5中进行from __future__ import with_statement
,因为with
关键字是新的,不应再作为variables名使用。 为了能够使用一个使用名为with
variables的程序,需要上面的import语句。
另一个例子是
from __future__ import division print 8/7 # prints 1.1428571428571428 print 8//7 # prints 1
没有__future__
东西,这两个print
语句将打印1
。
内部的区别是没有这个导入, /
被映射到__div__()
方法,而使用__truediv__()
被使用。 (无论如何, //
调用__floordiv__()
。)
关键字print
: print
在3.x中成为函数,失去了作为关键字的特殊属性。 所以这是相反的。
>>> print >>> from __future__ import print_function >>> print <built-in function print> >>>
当你这样做
from __future__ import whatever
你实际上并没有使用import
声明,而是未来的声明 。 您正在阅读错误的文档,因为您实际上并未导入该模块。
未来的语句是特殊的 – 它们改变了你的Python模块的parsing方式,这就是为什么必须在文件的顶部。 它们赋予新的或不同的含义,即文件中的文字或符号。 从文档:
未来的陈述是编译器的一个指示,即应该使用将在未来特定版本的Python中提供的语法或语义来编译特定的模块。 未来的声明旨在缓解向未来版本的Python的迁移,这些版本将引入对语言不兼容的更改。 它允许在function成为标准的版本之前,在每个模块的基础上使用新function。
如果你真的想要导入__future__
模块,就这样做
import __future__
然后像往常一样访问它。
__future__
是一个伪模块,程序员可以使用它来启用与当前解释器不兼容的新语言function 。 例如,expression式11/4
当前评估为2
。 如果执行它的模块已经启用了真正的除法:
from __future__ import division
expression式11/4
将评估为2.75
。 通过导入__future__
模块并评估其variables,您可以看到何时首次将新function添加到该语言中,以及何时将成为默认值:
>>> import __future__ >>> __future__.division _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
可以使用它来使用在较旧版本的Python中出现在新版本中的function。
例如
>>> from __future__ import print_function
将允许您使用print
function:
>>> print('# of entries', len(dictionary), file=sys.stderr)
还是说“因为这是python v2.7,使用不同的'打印'function,它已被添加到python v2.7,它被添加到python 3之后。所以我的'打印'将不再是语句(例如打印“消息”),但function(例如,打印(“消息”,选项)。这样,当我的代码在python 3中运行,“打印”不会中断。
在
from __future__ import print_function
print_statement是包含“print”的新实现的模块,就像它在python v3中的行为一样。
这有更多的解释: http : //python3porting.com/noconv.html
我发现非常有用的一个用途是来自未来模块的print_function。
在Python 2.7中,我希望不同打印语句的字符在同一行上打印,不能有空格。
它可以在最后使用逗号(“,”)来完成,但它也会附加一个额外的空间。 上述语句用作:
从将来importprint_function … print(v_num,end =“”)…
将在每行中打印出v_num的值,而不用空格。
在Python 3.0之后,print不再只是一个声明,而是一个函数。 并包含在PEP 3105中。
另外我觉得Python 3.0包仍然有这些特殊的function。 让我们通过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: * ** *** ****
如果我们使用正常的打印function,我们将无法实现相同的输出,因为print()带有额外的换行符。 所以每当内循环执行时,它都会将*打印到下一行。