2016-11-04 265 views
1

正如另一篇文章(https://stackoverflow.com/a/7075121/2706606)所解释的那样,在python中你可以从未来导入东西。python中只有一个“未来”的宇宙吗?

例如2/4评估为0(因为它是一个整数除法)。

>>>print 2/4 
0 

但是如果你从未来导入“师”,其值为0.5

>>> from __future__ import division 
>>> print 2/4 
0.5 

我从链接后不解的是,解析器不同的解析代码,当您使用未来的进口。

而我的问题是,是否只有一个单一的,独特的“未来”环境,所有这些未来的进口是从哪里取得的?

我们如何保证将来的导入将与未来版本的python编译器向前兼容?

是否有可能在“更遥远的将来”2/4会评估其他价值?

+0

'__future__'仅在Python 2中使用,它几乎死亡。将来没有人会需要这个。 – furas

+0

是的。未来的环境被称为Python 3. –

+2

@furas:绝对不是。它现在在Py3中用于新事物,用于'generator_stop'([ref](https://docs.python.org/3/library/__future__.html))。尽管未来一旦到来,进口就不会做任何事情;它们被识别,但被忽略(因为默认语法已经包含了它们)。如果你在你的Python版本中导入了一些还不存在的东西(例如在2.4中导入了'with_statement'),你会得到一个异常,让你知道代码与旧版本的Python不兼容。 – ShadowRanger

回答

1

如果您查看导入__future__,有一个名为all_feature_names的列表,您可以使用它查看Python解释器可用的功能。

import __future__ 
print(__future__.all_feature_names) 

在我的机器上,哪一个会在Python 2.7.12上返回以下内容。

['nested_scopes', 'generators', 'division', 'absolute_import', 
'with_statement', 'print_function', 'unicode_literals'] 

并与Python 3.5.2。

['nested_scopes', 'generators', 'division', 'absolute_import', 
'with_statement', 'print_function', 'unicode_literals', 
'barry_as_FLUFL', 'generator_stop'] 

然而有不能保证你正在运行将具有相同的功能可用,进口可能无法在一些实现甚至还存在,但假设功能是可用的Python解释器的实现应该保持不变,只要它是根据PEP(例如PEP-0238)实现的,大多数Python解释器都应该这样做。

+1

为了记录,'from __future__ import barry_as_FLUFL' ['best](http://stackoverflow.com/a/4007310/364696)'__future__'导入。 :-) – ShadowRanger

+0

@ShadowRanger怎么样'from __future__ import braces' – abukaj

2

来自未来的特征不会改变意义。这是保证from __future__ import x有以下三种行为:

  1. 在一个版本的Python定义未来的行为之前,抛出一个异常指示代码不兼容
  2. 在一个Python版本的行为变得之前在默认情况下,它使行为
  3. 在一个Python版本的行为变得之后,默认情况下,进口是公认的,但忽略

他们不会重用一个名字的意思是别的东西以后(因为会vi提出了#3的“认可但忽视”规则)。如果他们决定再次更改division,则需要使用新名称,例如为了使其截至零分而不是分区划分,他们可能会导入一个名为truncating_division的导入__future__。但他们不会删除division,永远,只要Python的存在,他们也将改变含义,:

无特征描述将永远不会从__future__删除。