我正在编写python模块,并使用其他不同模块的许多导入。我有点困惑,我是应该在打开文件时导入所有必要的依赖模块,还是在必要时导入它。
我还想知道两者的含义。
我来自C++后台,所以我对这个特性感到非常兴奋,没有看到任何不使用__import__()的理由,只在我的函数中需要时才导入模块。
请在这件事上放点光。
发布于 2014-02-21 11:53:28
若要编写更少的代码,请在脚本的第一行导入一个模块,例如:
#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中,该字典是一个查找表,用于在运行相同的导入语句时加速。
正如@bruno所提到的,导入insede函数可能不是那样的pythonic,它违反了PEP8,这里是一次我发现的讨论,大部分时间您应该坚持在文件的顶部导入。
发布于 2014-02-21 11:54:08
首先,通常在任何地方都不需要__import__。它的主要目的是支持动态导入那些你事先不知道的东西(比如插件)。您可以很容易地在函数中使用import语句:
import sys
def foo():
import this
if __name__ == "__main__":
print sys.version_info
foo()提前导入所有东西的主要优势是这是最习惯的。。在这里,阅读您的代码的人会去查看是否导入了某些内容。而且,您不需要在每个使用import os的函数中编写os。这种办法的主要缺点是:
A imports B,它导入A)第二个问题并不是典型的问题--您很少注意到导入的性能或内存影响。
如果遇到第一个问题,这很可能是分组错误的代码的一个症状,应该将常见的内容分解到一个新的模块C中,A和B都可以使用这个模块。
发布于 2014-02-21 12:09:09
首先,它违反了使用导入内部函数的PEP8。调用import --即使模块已经加载,这也是一个昂贵的调用,因此,如果您的函数将被多次调用,这将不会补偿性能的提高。
此外,当您调用“导入测试”python时,请执行以下操作:
dataFile = __ import__('test')
导入在文件顶部的唯一缺点是名称空间受到了非常快的污染,这取决于文件的复杂性,但是如果您的文件太复杂,这是一个错误设计的信号。
https://stackoverflow.com/questions/21933555
复制相似问题