【问题标题】:Use walrus operator in Python 3.7在 Python 3.7 中使用海象运算符
【发布时间】:2020-03-10 21:57:53
【问题描述】:

为什么未来的导入仅限于某些功能?有没有办法在 Python 3.7 中获取海象运算符?我认为这会起作用,但它不起作用:

from __future__ import walrus

它不起作用,因为 walrus 不在支持的功能列表中:

__future__.all_feature_names
['nested_scopes', 'generators', 'division', 'absolute_import', 'with_statement', 'print_function', 'unicode_literals', 'barry_as_FLUFL', 'generator_stop', 'annotations']

除了使用 python 3.8,还有其他选择吗?

【问题讨论】:

  • Why are future imports limited to only certain functionality?——你是不是建议每个新版本的 Python 中的每一个新特性都应该追溯添加到以前的版本中?
  • 为什么未来的导入仅限于某些功能?请参阅meta.stackoverflow.com/questions/323334/…
  • @AMC 我认为这不适用于这种情况,因为 OP 提出的建议在逻辑上是不可能的,而不是设计决定;所以答案可以用事实和推理来解释为什么这是不可能的,而不是用意见来解释为什么会这样决定。
  • @kaya3 啊,我明白你的意思了,我读过为什么未来的导入仅限于某些功能?“为什么/如何选择这些功能”。
  • 在 Python 3.7 中使用海象运算符并非不可能,但它需要您通过导入挂钩编写自己的源代码转换。这当然不推荐用于任何严肃的代码,但它可以用于实验目的。

标签: python python-import


【解决方案1】:

如果您使用的 Python 版本不包含某个功能的实现,则您不能使用该功能;编写from __future__ import ... 不会导致该功能在您安装的Python 版本中实现。

__future__ 导入的目的是为可能破坏现有程序的新功能提供“选择加入”期。例如,当 / 运算符对整数的行为被更改为 3/21.5 而不是 1(即除法)时,如果它只是在一夜之间更改,这会破坏很多代码。因此这两种行为都在接下来的几个 Python 版本中实现,如果您使用的是其中一个较新版本,那么您可以使用 from __future__ import division 选择新行为。但是您之所以能够这样做,是因为您使用的 Python 版本确实实现了新行为。

海象运算符是在 Python 3.8 中引入的,因此如果您使用的是 3.8 之前的版本,那么它不包含该运算符的实现,因此您无法使用它。无需使用__future__ 来使海象运算符“选择加入”,因为引入具有新语法的新运算符不会破坏任何现有代码。

【讨论】:

    【解决方案2】:

    您可以read the PEP 介绍__future__ 以获得洞察力。首先,

    有时,Python 会对核心语言结构的宣传语义做出不兼容的更改,或者以某种方式更改它们的意外(依赖于实现)行为。虽然这绝不是反复无常的,而且总是以长期改进语言为目的,但从短期来看,这是有争议的和破坏性的。

    海象运算符不是向后不兼容的更改:它不会改变已经“工作”的代码的含义。 := 之前只是语法错误。

    因此,甚至从未考虑将其添加到 __future__。您可能会反对说,“with”语句同样是全新的,但并非完全如此:“with”不是保留字,它的引入可能会破坏使用“with”作为标识符的工作代码。

    所以,抱歉,请使用 3.8,否则你就不走运了。不要向信使开枪;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2020-11-17
      相关资源
      最近更新 更多