我正在编写一个python模块,我正在使用许多其他不同模块的导入。 我有点困惑,我是否应该在文件的开头导入所有必要的依赖模块,或者我是否应该在必要时进行。
我也想知道两者的含义。
我来自C ++背景,所以我对此功能感到非常兴奋,并且没有看到任何不使用__import__()
的原因,仅在我的函数内部需要时导入模块。
请注意这一点。
答案 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
)第二个问题通常不是问题 - 您很少注意到导入的性能或内存影响。
如果您遇到第一个问题,可能是代码分组不佳的症状,应将常见内容纳入C
和A
可以使用的新模块B
中
答案 2 :(得分:0)
首先,使用函数内部导入违反了PEP8。
调用导入它是一个昂贵的调用即使模块已经加载,所以如果你的函数被多次调用,这将不会补偿性能增益。
当你打电话给“进口测试”蟒蛇时这样做:
dataFile = __ import __('test')
文件顶部导入的唯一缺点就是根据文件的复杂程度,污染的命名空间非常快,但如果你的文件太复杂,那就是设计不良的信号。