import module_name Vs __import __('module_name')

时间:2014-02-21 11:43:46

标签: python import

我正在编写一个python模块,我正在使用许多其他不同模块的导入。 我有点困惑,我是否应该在文件的开头导入所有必要的依赖模块,或者我是否应该在必要时进行。

我也想知道两者的含义。

我来自C ++背景,所以我对此功能感到非常兴奋,并且没有看到任何不使用__import__()的原因,仅在我的函数内部需要时导入模块。

请注意这一点。

3 个答案:

答案 0 :(得分:1)

要编写更少的代码,请在脚本的第一行导入模块,例如:

#File1.py
import os

#use os somewhere:
os.path.chdir(some_dir)
...
...
#use os somewhere else, you don't need to "import os" everywhere
os.environ.update(some_dict)

虽然有时您可能需要在本地导入模块(例如,在函数中):

abc=3
def foo():
  from some_module import abc #import inside foo avoids you from naming conflicts
  abc(...) #call the function, nothing to do with the variable "abc" outside "foo"

多次调用foo()时不要担心时间消耗,因为import语句只加载模块/函数一次。导入模块/函数后,对象将存储在字典sys.modules中,这是运行相同import语句时加速的查找表。

正如@bruno desthuilliers所提到的,导入insede函数可能不是pythonic,它违反PEP8,这里是a discussion I found,你应该坚持在大部分时间都在文件的顶部导入。 / p>

答案 1 :(得分:1)

首先,__import__通常不需要 。它的主要目的是支持动态导入您不知道的事物(想想插件)。您可以在函数中轻松使用import语句:

import sys

def foo():
    import this

if __name__ == "__main__":
    print sys.version_info
    foo()

预先导入所有内容的主要优点是it is most customary。这是人们阅读你的代码将去看看是否导入的东西。此外,您无需在使用import os的每个函数中编写os。这种方法的主要缺点是:

  • 您可以让自己进入无法解析的导入循环(A导入B导入A
  • 即使您不打算使用它,也要将所有内容都记入内存。

第二个问题通常不是问题 - 您很少注意到导入的性能或内存影响。

如果您遇到第一个问题,可能是代码分组不佳的症状,应将常见内容纳入CA可以使用的新模块B

答案 2 :(得分:0)

首先,使用函数内部导入违反了PEP8。 调用导入它是一个昂贵的调用即使模块已经加载,所以如果你的函数被多次调用,这将不会补偿性能增益。

当你打电话给“进口测试”蟒蛇时这样做:
dataFile = __ import __('test')

文件顶部导入的唯一缺点就是根据文件的复杂程度,污染的命名空间非常快,但如果你的文件太复杂,那就是设计不良的信号。