python - 我今天还需要 __future__ 吗?
问题描述
我对 Python__future__
模块的用例不是很熟悉,只是在一些在线文章的演示代码中看到过它。在阅读之后,我想这与面向未来的现有代码有关?我承认我不完全明白我在读什么。根据官方文档,它的功能是:
- 为了避免混淆分析导入语句并期望找到它们正在导入的模块的现有工具。
- 为了确保未来语句在 2.1 之前的版本下运行,至少会产生运行时异常(future的导入将失败,因为在 2.1 之前没有该名称的模块)。
- 记录何时引入了不兼容的更改,以及何时将 - 或曾经 - 强制执行。这是一种可执行文档的形式,可以通过导入future并检查其内容以编程方式进行检查。
第 1 点是什么意思?是不是说如果解释器读取了一个 import 语句,但没有找到它正在导入的模块,haveimport __future__
会阻止它抛出错误?
随着 Python 2.7 于 2020 年 1 月 1 日正式结束生命周期,如果我无意在我的 Python 3 代码中支持 Python 2 环境,那么我认为第 2 点与我无关。
第 3 点是为了...调试,我猜?这就是它想要表达的意思吗?
我注意到到目前为止我读过的所有文章都是至少五年前的。所有示例都集中在处理 Python 2 向后兼容性的 Python 3 代码上,特别print
是//
. 但就像我说的,我无意支持 Python 2。
Python 中的 __future__ 用于什么以及如何/何时使用它,以及它是如何工作的
import __future
那么,如果没有预期的 Python 2 向后兼容性,我什么时候需要在 Python 3 开发中使用?在这种情况下,我什至还需要它吗?
解决方案
有什么意义__future__
?
__future__
允许在语言中引入向后不兼容的新行为。例如,在Python 2.2 - 2.7中,您可以这样做:
>>> 3/2
1
>>> from __future__ import division
>>> 3/2
1.5
__future__
意思是“我们将此功能添加到语言中,但我们不能将其设为默认值,因为它会破坏其他代码”。
当初为什么要__future__
介绍?
假设您有一个 Python 2 项目,并且想要将其转换为 Python 3。与其一次性将其转换为“大爆炸”并希望它在 Python 3 下仍具有相同的行为,开发人员可以逐个升级他们的项目,division
例如首先导入并测试回归,然后导入print_function
等等。
__future__
在 Python 3 中有什么用?
“Python 4”版本还没有出现。但是Python 3 已经以这种方式添加了两个特性:
+----------------|---------------|----------------+
| feature | __future__ in | implemented in |
|----------------|---------------|----------------|
|----------------|---------------|----------------|
| generator_stop | 3.5 | 3.7 |
|----------------|---------------|----------------|
| annotations | 3.7 | 3.10 |
+----------------|---------------+----------------+
这两个更改都是向后不兼容的。这意味着语言维护人员对生成器的工作方式进行了重大更改,并准备在 3.5 中发布。然而他们把它“隐藏”在了__future__
模块中,因为他们担心如果他们直接把它放出来,一堆包会在 3.5 的发布时被破坏。
Python 中总是存在较小的向后不兼容的更改,例如在 3.7 中引入了async
andawait
关键字,这使得将它们用作变量名 ( async = 1
) 的代码中断。是直接引入一个特性,还是引入一个特性,这真的是一个判断要求__future__
,这取决于迁移的工作量。
因此,将其作为一个功能放入__future__
其中允许维护者DeprecationWarning
有一个过渡期,从而允许及早选择加入该功能。
推荐阅读
- angular - 通过导入父组件来修改数据的坏习惯?
- sql - 将单引号放入 SQL Server 字符串中的单引号中
- javascript - 更改DOM时jquery .each函数发生冲突
- java - 下载大量数据并存储在 Android 和 iOS 上
- azure - MSAL/ADAL C++ 等效于获取访问令牌
- javascript - 对包含带空格的文本的数组进行排序
- tensorflow - 在不使用 Keras 的情况下创建自己的卷积网络
- r - 在 R 中,如何计算 argmax 之后的变量数?
- flutter - 如何在 Flutter 中制作手势驱动动画?
- python - 如何在 TensorFlow 2.0 中使用 tf.Lambda 和 tf.Variable