2012-03-08 136 views
7

哪种风格更适合?导入模块级别还是功能级别?

风格答:

def foo(): 
    import some_module 
    some_module.something 

样式B:

import some_module 

def foo(): 
    some_module.something 

假设some_module未在代码别处使用,仅此函数内。

回答

15

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

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

def f(): 
    import something 
    return None 
您导入的(编译)进口和返回语句得到一个名为“F”在这一点上相关的模块中

。当你运行时,运行 f(),那里运行的是import语句。

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

因此,作为一个经验法则,“将所有内容导入顶部”直到进行了大量的分析并发现导入“巨大的东西”在90%的运行中浪费大量时间,有10%的时间有一点时间。

6

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

+0

+1对于PEP8。 [pep8模块](http://pypi.python.org/pypi/pep8)会根据PEP8准则检查您的代码。 – 2012-03-08 07:35:18