为啥 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_literals
、print_function
),因为它们可能会修改(或者更确切地说切换到不同版本的)语法。因此,必须尽早知道它们。它们当然也会对代码生成产生影响 (division
)。
因此,除了清晰度问题之外,还有很好的设计理由强制这些语句位于解析和编译的开头。
其他导入的模块对__future__
的你的 模块中发生的事情没有任何影响。这是一件好事,否则其他模块可能会通过从 __future__
导入 print_function
来破坏您的模块。
【讨论】:
所以这是因为__future__
导入是特殊的,它们能够影响解析器,因此如果允许将它们放在任何地方,就像其他 import
s 一样,解析器会变得太复杂或者在我们目前的状态下,会失败,对吗?
没错。另外,如果将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 样式的打印? [关闭]
Python学习from __future__ import print_function用法