为啥 Python 中的 future 语句需要放在一切之前?

Posted

技术标签:

【中文标题】为啥 Python 中的 future 语句需要放在一切之前?【英文标题】:Why do future_statements in Python need to be placed before everything?为什么 Python 中的 future 语句需要放在一切之前? 【发布时间】:2015-07-26 03:11:24 【问题描述】:

PEP 236 明确指出所有future_statements 必须出现在模块顶部附近,并且只允许在它们之前使用 cmets、文档字符串等。

我知道这作为一种编程实践是没有争议的——这是规则,而且很明确。但是,当您未能将 future_statement 放在最顶部(又名,警告)。

是不是因为这样,导入 future_statement 将导入的自己的名称版本的模块将能够覆盖它们,从而确保它们能够正常工作?是否要保持某种强大的代码清晰度,以便在意外忽略 __future__ 导入时不会因为潜在的灾难而破坏正确的编码实践? PEP 对此没有启发,我无法找到任何线索来找出原因。

【问题讨论】:

future 语句是对编译器的一个指令,指示特定模块应使用 Python 的指定未来版本中可用的语法或语义进行编译。 【参考方案1】:

__future__ 语句甚至可能对解析产生影响(例如:unicode_literalsprint_function),因为它们可能会修改(或者更确切地说切换到不同版本的)语法。因此,必须尽早知道它们。它们当然也会对代码生成产生影响 (division)。

因此,除了清晰度问题之外,还有很好的设计理由强制这些语句位于解析和编译的开头。

其他导入的模块对__future__你的 模块中发生的事情没有任何影响。这是一件好事,否则其他模块可能会通过从 __future__ 导入 print_function 来破坏您的模块。

【讨论】:

所以这是因为 __future__ 导入是特殊的,它们能够影响解析器,因此如果允许将它们放在任何地方,就像其他 imports 一样,解析器会变得太复杂或者在我们目前的状态下,会失败,对吗? 没错。另外,如果将from __future__ import print_function 放在函数内,它的作用范围将如何?它只会影响该功能吗?或者当函数被完全解析时,解析器是否必须切换回非print_function 语法?这些问题的答案带来了可怕的复杂性和可读性问题。 这似乎充分回答了我的问题,我只是稍等片刻接受它,以便为其他人提供机会,如果有人在附近,可以添加他们的答案。如果没有更好的结果出现,我怀疑有什么比这更好的答案,我会接受这个作为答案。【参考方案2】:

估计是为了避免下面这种情况:

print "yo"
from __future__ import print_function

打印语句是否是语法错误?这取决于未来的导入是否适用于整个文件或仅从那时起。最好明确指出不作为顶部的导入是错误的。

【讨论】:

但这可能发生在任何import 上,而且可能是故意的。警告肯定是有道理的,但错误感觉就像有更危险的事情是可能的。

以上是关于为啥 Python 中的 future 语句需要放在一切之前?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在类方法中使用 python 模块 concurrent.futures?

为啥使用 from __future__ import print_function 会破坏 Python2 样式的打印? [关闭]

为啥 Future.Builder 中的快照从不出错?

Python学习from __future__ import print_function用法

python中的future,你见过可以使用未来版本模块的语言吗?

为啥我们需要 Python 中的“finally”子句?