什么是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名使用。 为了能够使用一个使用名为withvariables的程序,需要上面的import语句。

另一个例子是

 from __future__ import division print 8/7 # prints 1.1428571428571428 print 8//7 # prints 1 

没有__future__东西,这两个print语句将打印1

内部的区别是没有这个导入, /被映射到__div__()方法,而使用__truediv__()被使用。 (无论如何, //调用__floordiv__() 。)

关键字printprint在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 

将允许您使用printfunction:

 >>> 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()带有额外的换行符。 所以每当内循环执行时,它都会将*打印到下一行。