【发布时间】:2015-09-24 20:40:34
【问题描述】:
在 Python 中,imports 似乎是真正的词法范围。这是真的吗?
例如,如果您这样做:
def some_function:
import sys
print sys.argv[0]
你会得到一个错误:
Traceback (most recent call last):
File "example.py", line 4, in <module>
print sys.argv[0]
NameError: name 'sys' is not defined
在 Perl 中,
use语句没有词法作用域,但是如果您尝试按词法定义它们(即在子例程中),Perl 不会给您一个语法错误。这样做会导致混乱,并被视为非常糟糕的做法。
在 Python 中,事情似乎并非如此。我相信我在某处读到过,始终将 import 语句放在代码顶部被认为是一种很好的做法,但是如果它们确实是词法范围,如示例所示(意味着它们不能在外部访问定义它们的范围),我不明白为什么将它们放在你使用它们的地方会被认为是不好的做法。
在 Python 中,是否有任何理由对 imports 进行词法范围界定是不好的做法?如果是,请解释原因?
【问题讨论】:
-
我不喜欢词法范围的导入,因为很难找到以这种方式使用的模块。
-
基于函数的导入在循环导入相关问题的情况下很常见,否则没有充分的理由仅在函数级别导入模块,因为即使使用名称
sys无法访问该模块仍可通过sys.modules['sys']获得。 -
在q 中出现了“不将导入放在首位的理由”这一最有趣的案例。有趣的是,我的意思可能是“可怕”。
-
“在 Python 中,导入似乎是真正的词法范围。这是真的吗?”是的,
import将 本地范围 中的名称绑定到所需的模块。
标签: python coding-style standards python-import lexical-scope