【问题标题】:Is importing form __future__ reliable? [duplicate]导入表格 __future__ 可靠吗? [复制]
【发布时间】:2022-02-03 07:17:06
【问题描述】:

我的理解是,从 __future__ 导入让我可以使用尚未发布的 python 的功能。听起来它们仍在进行中,例如应用程序或操作系统的 beta(种子)版本。如果它们完全完成,并且针对所有预期的交互和边缘情况进行了彻底的测试,那么它们已经在 python 的正式版本中了,对吧?我是否正确,如果我使用从__future__ 导入的函数,那么我冒着无法按我希望/预期的方式工作的风险?没有像宣传的那样工作?

【问题讨论】:

  • 如果问题是“我可以确定我目前通过导入 __future__ 获得的行为将是更高版本 Python 中的默认行为吗?” - 据我所知,他们故意围绕这一点进行设计,并且迄今为止拥有完美的业绩记录。

标签: python


【解决方案1】:

这不是目的。您应该阅读介绍此功能的the PEP

目的是在对语言进行不兼容更改时允许宽限期。我们不能在不破坏现有代码的情况下发布这样的更改。但人们仍然想要“现在”的新功能。

所以有一个折衷方案:现在想要它的人可以“从未来”导入它,而尚未准备好它的人可以看到指出代码含义的弃用警告将 em> 在以后的版本中进行更改(当相关功能成为语言的一部分时)。

【讨论】:

  • 我理解并尊重import from __future__ 的目的,但这不是我的问题。我的问题是,由于我启用了新功能,它们是否可能尚未 100% 可靠地实现?我想我从那个 PEP 中看到了答案:我的担心是对的。在lib/__future__.py 中,每个功能都被列为 alpha、beta、候选或最终。因此,对于我可能想从__future__ 导入的每个功能,我都可以(并且非常应该)检查那里的可靠性(即它是最终的吗?)。这是正确的吗?
  • __future__ 引入的新行为与没有它引入的新行为之间没有区别,除非它们是否需要使用 __future__ 来处理它们。例如,所有新行为首先在 alpha 或 beta 版本中引入(alpha 等指的是 Python 版本,而不是功能)。当它们进入最终版本时,它们已经尽可能地进行了测试,但这与是否涉及__future__ 无关。当然,无论如何都不能保证。也就是说,很难让很多人尝试任何形式的预发布版本。
【解决方案2】:

__future__ module 并不真正让您使用新功能,而是让您启用可能破坏现有代码的新功能或更改功能。它旨在让开发人员确保他们的代码能够适应未来的 Python 版本,并可以选择在生产环境中禁用它们,直到代码完全更新以使用该功能。

__future__ 中列出的大多数功能实际上是在达到启用它们的版本时默认启用的。目前,唯一未默认启用的功能是 annotations,它会导致所有类型提示都被解释为字符串,从而防止循环引用并允许防止由于静态类型而导致的循环导入。

因此__future__ 中的新功能使用起来非常安全,如果您选择使用它们,也不会冒破坏代码的风险。

【讨论】:

  • 我将您的回答解释为 __future__ 中的新功能:(1)确实是新代码,因为它们是“新功能或更改功能”,并且(2)可能不是 100% 可靠因为您说新版本中启用了 MOST,但例如目前 Annotations 确实不是最终版本。我看到我可以在lib/__future__.py 中检查功能是否是最终的。
  • 大多数已启用意味着这些功能不值得导入,因为该功能已完全集成。这些功能是 100% 可靠的,只是它们在默认情况下被禁用,因为它们可能会由于改变现有行为而破坏现有代码。
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2019-03-24
  • 2012-02-24
  • 1970-01-01
  • 2012-09-14
相关资源
最近更新 更多