龙听期货论坛's Archiver

龙听 发表于 2024-3-6 11:41

什么是 __future__ 模块 ?【python量化编程必读!】

前言

不知道大家有没有注意到 python 有一个 __future__ 模块,如果大家有人看开源项目兼容 py2 和 py3 的话,它们的源代码中会经常出现这个模块,那么这个模块究竟有什么作用呢?

__future__

关于 __future__ 的作用,官方文档中也有明确提到,让我们看一下:

_future_ is a real module, and serves three purposes:

1. To avoid confusing existing tools that analyze import statements and expect to find the modules they’re importing.
2. To ensure that future statements run under releases prior to 2.1 at least yield runtime exceptions (the import of __future__ will fail, because there was no module of that name prior to 2.1).
3. To document when incompatible changes were introduced, and when they will be — or were — made mandatory. This is a form of executable documentation, and can be inspected programmatically via importing __future__ and examining its contents.

翻译过来大致意思如下:

为了避免混淆现有工具,分析import语句和期望找到他们要导入的模块。
确保2.1之前的版本导入 __future__产生运行时异常,因为2.1之前没有这个模块
记录何时引入了不兼容的更改,以及何时将其强制执行。 这是一种可执行文档,可以通过导入 __future__进行可编程式检查。

其实总结起来很简单, python 在新版本会引入某些新的功能特性,但是有的时候有些改动是不兼容旧版本的,举个例子说,比如你的项目是用的是 py2.7,现在你需要迁移到 3.x 版本,直接升级到 3.x 肯定是不行的,那怎么办呢?这个时候就需要用到 _future_ 了,我们可以通过 __future__导入新版本某些模块,测试新版本的新功能,等测试成功后再升级到新的版本上.

例子

说完了,我们举个最典型的例子, print, 使用过 py2.7 和 py3.x 的小伙伴肯定都知道,在 3.x 的时候,print 成了一下函数,那么让我们在 py2.7 通过 __future__ 感受一下

[img]http://p.algo2.net/2024/0306/7a6d63801229e.png[/img]

除了 print,还有其他不少类似的,在官方文档中都有提及到,我这里就简单截个图,有兴趣的可以自己去官网研究一下

[img]http://p.algo2.net/2024/0306/1e7d767fee3ea.png[/img]

参考1:[url=https://docs.python.org/3.6/library/__future__.html?highlight=__future__#module-__future__]https://docs.python.org/3.6/libr ... _#module-__future__[/url]
参考2:[url=https://stackoverflow.com/questions/7075082/what-is-future-in-python-used-for-and-how-when-to-use-it-and-how-it-works]https://stackoverflow.com/questi ... it-and-how-it-works[/url]

[b]说白了就是将新版本的特性导入到当前版本,官方文档就不是写给初学者看的[/b]

龙听 发表于 2024-3-6 11:42

原链接:[url]https://zhuanlan.zhihu.com/p/54286215[/url]

龙听 发表于 2024-3-6 11:44

Python 中的 __future__ 用来做什么,如何使用/何时使用,以及如何工作

__future__ 经常出现在 Python 模块中。即使阅读了 Python 的 __future__ 文档,我也不明白 __future__ 是做什么用的,以及如何/何时使用它。

有人能举例说明吗?

我得到的一些关于 __future__ 基本用法的答案似乎是正确的。

但是,我还需要了解 __future__ 的工作原理:

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

我猜测当前版本打包了未来版本的潜在功能。但是,这些特性只有通过使用 __future__ 才能使用,因为它们不是当前的标准。如果我是对的,请告诉我。

**** Hidden Message *****

龙听 发表于 2024-3-6 11:47

29.10. __future__ - 未来语句定义

源代码 Lib/__future__.py

__future__ 是一个真正的模块,有三个作用:

避免混淆现有的工具,这些工具会分析导入语句,并期望找到它们要导入的模块。

确保在 2.1 之前的版本中运行 future 语句至少会产生运行时异常(导入 __future__ 将失败,因为在 2.1 之前没有这个名字的模块)。

记录何时引入了不兼容的变更,以及这些变更何时将被强制执行。这是一种可执行的文档形式,可以通过导入 __future__ 并检查其内容来进行编程检查。

__future__.py中的每条语句都是这样的形式:

FeatureName = _Feature(OptionalRelease,MandatoryRelease,CompilerFlag),其中,OptionalRelease 通常小于 MandatoryRelease,并且两者都是与 sys.version_info 格式相同的 5 元组:

(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
)

OptionalRelease 记录功能被接受的第一个版本。

在 MandatoryRelease 尚未发生的情况下,MandatoryRelease 将预测该功能成为语言一部分的版本。

否则 MandatoryRelease 会记录该特性成为语言一部分的时间;在该时间或之后的版本中,模块不再需要 future 语句来使用相关特性,但可以继续使用此类导入。

MandatoryRelease 也可以是 None,这意味着计划中的特性被放弃了。

类 _Feature 的实例有两个相应的方法:getOptionalRelease() 和 getMandatoryRelease()。

CompilerFlag 是内置函数 compile() 的第四个参数传递的(位域)标志,用于在动态编译代码中启用功能。该标志存储在 _Feature 实例的编译器_flag 属性中。

任何特性描述都不会从 __future__ 中删除。自从在 Python 2.1 中引入该机制以来,下列特性已通过该机制进入了 Python 语言:

[img]http://p.algo2.net/2024/0306/23cc2c512073d.png[/img]

**** Hidden Message *****

龙听 发表于 2024-3-6 11:49

使用方法:[code]from __future__ import print_function, absolute_import[/code]

页: [1]