Python中的“未来”用于什么,如何/何时使用,以及它是如何工作的

Python中的“未来”用于什么,如何/何时使用,以及它是如何工作的,python,python-2.x,Python,Python 2.x,\uuuuu future\uuuuu经常出现在Python模块中。我不明白什么是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu以及阅读后如何/何时使用它 有人能举例说明吗 我收到的一些关于\uuuuu future\uuuu基本用法的答案似乎是正确的 但是,关于\uuuu future\uuuu的工作原理,我还需要了解一件事: 对我来说,最令人困惑的概念是当前python版本如何包含未来版本的特性,以及如何在当前python版本中

\uuuuu future\uuuuu
经常出现在Python模块中。我不明白什么是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
以及阅读后如何/何时使用它

有人能举例说明吗

我收到的一些关于
\uuuuu future\uuuu
基本用法的答案似乎是正确的

但是,关于
\uuuu future\uuuu
的工作原理,我还需要了解一件事:

对我来说,最令人困惑的概念是当前python版本如何包含未来版本的特性,以及如何在当前python版本中成功编译使用未来版本特性的程序


我猜当前版本包含了未来可能的功能。但是,这些功能仅可通过使用
\uuuuu future\uuuu
获得,因为它们不是当前的标准。如果我是对的,请告诉我。

包含
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
模块后,您可以慢慢习惯于不兼容的更改或引入新关键字的更改

例如,对于使用上下文管理器,您必须在2.5中使用语句从uuu未来uu导入
,因为
with
关键字是新的,不应再用作变量名。为了在Python2.5或更早版本中使用
with
作为Python关键字,您需要使用上面的导入

另一个例子是

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1
如果没有
\uuuuu future\uuuuuu
的东西,两个
print
语句都会打印
1

内部区别在于,如果没有该导入,
/
将映射到
\uuuu div\uuu()
方法,而使用该方法时,将使用
\uuu truediv\uu()
。(在任何情况下,
/
调用
\uuu floordiv\uuu()

关于
print
print
成为3.x中的一个函数,失去了作为关键字的特殊属性。因此,情况正好相反

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
>>打印
>>>来自未来导入打印功能
>>>印刷品
>>>
当您这样做时

from __future__ import whatever
实际上,您使用的不是
import
语句,而是一个。您读取了错误的文档,因为您实际上没有导入该模块

未来的语句是特殊的——它们改变了Python模块的解析方式,这就是为什么它们必须位于文件的顶部。它们赋予文件中的单词或符号新的或不同的含义。从文档中:


future语句是对编译器的一个指令,指示特定模块应使用Python未来特定版本中可用的语法或语义进行编译。future语句旨在简化到Python未来版本的迁移,这些版本会对语言引入不兼容的更改。它允许在每个模块上使用新功能,然后在该功能成为标准之前发布

如果您真的想导入
\uuuuuuuuuuuuuuuuuuuuuu
模块,只需执行以下操作即可

import __future__

然后像往常一样访问它。

它可以用来使用新版本中出现的功能,而旧版本的Python则会出现这些功能

比如说

>>> from __future__ import print_function
将允许您使用
打印
作为一项功能:

>>> print('# of entries', len(dictionary), file=sys.stderr)
或者说“既然这是PythonV2.7,就使用在Python3中添加的PythonV2.7中添加的另一个‘print’函数。因此,我的‘print’将不再是语句(例如print“message”),而是函数(例如print(“message”,options)。这样,当我的代码在Python3中运行时,‘print’就不会中断。”

print_函数是包含“print”的新实现的模块,根据它在python v3中的表现


这有更多的解释:

是一个伪模块,程序员可以使用它来启用与当前解释器不兼容的新语言功能。例如,表达式
11/4
当前的计算结果为
2
。如果执行它的模块启用了true以执行方式划分:

来自未来进口部门

表达式
11/4
的计算结果将为
2.75
。通过导入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>模块并计算其变量,您可以看到新功能何时首次添加到语言以及何时将成为默认功能:

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

我发现非常有用的一个用途是
\uuu future\uu
模块中的
打印功能

在Python2.7中,我希望将来自不同print语句的字符打印在同一行上,不带空格

可以在结尾使用逗号(“,”)完成,但也会附加一个额外的空格。 上述声明在用作:

from __future__ import print_function
...
print (v_num,end="")
...

这将在不带空格的单行中打印每次迭代的
v_num
值。

在Python 3.0之后,打印不再只是一个语句,而是一个函数。它包含在PEP 3105中

此外,我认为Python 3.0包仍然具有这些特殊功能。让我们通过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:
*
**
***
****

如果我们使用普通的打印功能,我们将无法实现相同的输出,因为print()是带有一个额外的换行符。因此,每次执行内部for循环时,它都会将*打印到下一行。

已经有一些很好的答案,但没有一个能够完整列出
\uuuuuu future\uuu
语句当前支持的内容

简单地说,这个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
语句迫使Python解释器使用该语言的更新功能。


它当前支持的功能如下:

嵌套的\u范围
在Python 2.1之前,以下代码将引发一个名称错误

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
from\uuuu future\uuuu导入嵌套的\u作用域
指令将允许启用此功能

生成器
引入了生成器函数,如t
def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
with open('workfile', 'r') as f:
     read_data = f.read()
>>> from __future__ import division
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)
(
 PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)