在模块级别或功能级别导入?

时间:2012-03-08 07:08:51

标签: python function import module scope

哪种风格更可取?

样式A:

def foo():
    import some_module
    some_module.something

风格B:

import some_module

def foo():
    some_module.something

假设some_module未在代码中的其他地方使用,仅在此函数内部使用。

2 个答案:

答案 0 :(得分:29)

事实上,正如已经指出的那样,通常最好遵循PEP 8建议并在顶部进行进口。但也有一些例外。理解它们的关键在于你的第二段中的嵌入式问题:“在什么阶段导入......发生了什么?”

导入实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都会运行。 “def”也是一个可执行的陈述;它的执行导致定义的名称与(已编译的)代码相关联。所以如果你有:

def f():
    import something
    return None

在您导入的模块中,(编译的)import和return语句在该点与名称“f”关联。 运行 f()时,会运行import语句。

如果你推迟导入“非常大”或“重”的东西,然后你从不运行该函数(在这种情况下为f),则导入永远不会发生。这节省了时间(以及一些空间)。当然,一旦你实际调用了f(),就会发生导入(如果Python使用缓存结果时已经发生了,但仍然需要检查),这样你就失去了时间优势。

因此,根据经验,“在顶部导入所有内容”直到您完成大量分析并发现导入“巨大的东西”在90%的运行中浪费了大量时间,而不是保存10%的人很少有时间。

答案 1 :(得分:9)

PEP 8建议所有导入都发生在模块的顶部。所有名称,包括绑定到模块的名称,都按顺序在本地,非本地,全局和内置范围中搜索。