【问题标题】:How does __future__ statements know the syntax of new python versions?__future__ 语句如何知道新 Python 版本的语法?
【发布时间】:2020-06-21 17:55:22
【问题描述】:

我已经回答了有关 future 模块如何工作的问题。

What is __future__ in Python used for and how/when to use it, and how it works

How __future__ imports work under the hood .

但我仍然不明白的是,今天创建的解释器如何知道作为未来版本一部分的代码的语法。

我的想法是,当他们为 2.7 版本创建 Python 解释器时,他们构建代码并创建可执行文件,而不是触摸或修改它,用户将下载并使用它。假设 python 2.7 可执行文件是在 2009 年创建的。

python 3.7可执行文件是在2017创建的,python 2.7在导入print_function的时候怎么知道要编译什么代码呢? python 2.7 解释器如何知道 print_function 的代码是什么,将在解释器创建后引入。

我的看法是正确的还是完全错误的?

有人可以解开这个谜吗。

【问题讨论】:

  • __future__ 模块包含“向后移植”到 python2 的方法,解释器不需要知道任何未来的发展。
  • Python 解析器可以使用运行时操作进行配置。
  • 您链接的两个问题提到了这是如何完成的,例如告诉 Python 解释器 Python print 不是特殊关键字。这允许它被定义为模块中的一个函数。
  • 没有什么比说“我这周五午餐要吃鸡肉三明治”更“神秘”了。对更高版本语言的计划进行了布局、实施,有时还作为“选择加入”未来声明在当前版本中提供(以简化版本之间的转换)。

标签: python python-3.x python-2.7 interpreter


【解决方案1】:

Python 2.7.0 是在 Python 3.0.0 之后发布的,即在 print 变成一个函数之后。通过传递通过__future__ 导入激活(识别)的选项,编译器可以使用此类语法更改。

这种新语法确实在编译器中实现了;只有激活是可选的。这意味着您确实需要下载更新版本的 Python 才能选择使用 __future__ 功能之一。 Python 2.7.0 于 2010 年发布,而 Python 3.0.0 于 2008 年发布。所以从 2.7 的角度来看,它实际上是一个“旧”功能。尽管Python 2.5.6 是在 3.0.0 三年后发布的,但它不包含 print 函数的选择加入,因为它没有在那个小版本的 Python 中实现(2.5.0 于 2006 年发布)。这里的“未来”一词是指 Python 的未来(次要)版本,其中某个功能将成为强制性的。但是该功能的计划(PEP)实际上是更早创建的(即在将该功能作为可选功能引入的版本发布之前)。例如PEP 479: StopIteration handling inside generators:

  • PEP 创建于 2014 年
  • 3.5.0 中可选,2015 年发布
  • 3.7 中强制,2018 年发布

即使该功能在 2018 年成为强制性功能,计划(其 PEP)早在很久之前就已创建。

__future__ docs 很好地概述了某个功能何时可用。并非所有功能都已向后移植到 Python 的所有(次要)版本,即使它们支持 __future__ 导入。这是因为这些功能在这些次要版本发布后才可用。

【讨论】:

  • 这应该是推荐的答案。
【解决方案2】:

from __future__ import ... 只是说某项功能现在可用的一种过于可爱的方式,但您必须选择加入。将来,它将成为默认或必需。

每个定义的导入都带有两条信息:使该功能可选可用的版本,以及该功能将成为强制的版本。 __future__ 模块中从未删除任何功能。

从 Python 3.8 开始,__future__ 中有九个功能可用。除了annotations 之外,其他都是必填项。永远不需要在旧版本的 Python 中运行的新代码不需要导入它们。使用它们的旧代码不需要更新,即使导入实际上是无操作的。在 Python 4.0 发布之前,annotations 将保持为可选功能;没有日期,但可以保证annotations 将成为该版本的一部分,并且不是任何早期版本的强制性部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2013-08-22
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多