python - Python 中的本地导入语句

标签 python python-import

我认为将 import 语句放置在使用它的片段附近可以通过使其依赖关系更加清晰来提高可读性。 Python会缓存这个吗?我应该关心吗?这是个坏主意吗?

def Process():
    import StringIO
    file_handle=StringIO.StringIO('hello world')
    #do more stuff

for i in xrange(10): Process()

还有一点理由:它适用于使用库的神秘位的方法,但是当我将方法重构到另一个文件中时,我没有意识到我错过了外部依赖,直到出现运行时错误。

最佳答案

其他答案对 import 的真正工作原理有轻微的混淆。

此声明:

import foo

大致相当于这样的说法:

foo = __import__('foo', globals(), locals(), [], -1)

也就是说,它在当前范围内创建一个与请求的模块同名的变量,并将使用该模块名称和一大堆默认参数调用 __import__() 的结果分配给它.

__import__() 函数在概念上处理将字符串 ('foo') 转换为模块对象。模块缓存在 sys.modules 中,这是 __import__() 最先看到的地方——如果 sys.modules 有 'foo' 的条目>,这就是 __import__('foo') 将返回的内容,无论它是什么。它真的不在乎类型。您可以亲自看到这一点;尝试运行以下代码:

import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop

暂时不考虑风格问题,在函数中使用 import 语句可以满足您的需求。如果该模块以前从未被导入过,它会被导入并缓存在 sys.modules 中。然后它将模块分配给具有该名称的局部变量。它确实不是不修改任何模块级状态。它确实可能会修改一些全局状态(向 sys.modules 添加新条目)。

也就是说,我几乎从不在函数中使用 import。如果导入模块会在您的程序中造成明显的减速——比如它在静态初始化中执行长时间的计算,或者它只是一个庞大的模块——并且你的程序实际上很少需要模块来做任何事情,那么只在内部进行导入就很好了使用它的功能。 (如果这令人反感,Guido 会跳入他的时间机器并更改 Python 以阻止我们这样做。)但作为一项规则,我和一般 Python 社区将我们所有的 import 语句放在模块范围内的模块顶部。

关于python - Python 中的本地导入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699108/

相关文章:

python - 类型错误 : only length-1 arrays can be converted to Python scalars while trying to exponentially fit data

Python 函数不调用 __init__

python - 缺失值的插值

python - 解决python中的循环导入错误

python - Virtualenv 中的导入错误

Raspberry Pi 上的 Python 导入模块

相当于 bash 的 {1..4} 的 Python 正则表达式

python - 在 Python 中返回累​​加器的函数

python - 除非 root 用户,否则无法导入 python 模块

python - 按完整路径导入具有相似内部模块名称的 python 包