首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入module_name Vs __import__(“module_name”)

导入module_name Vs __import__(“module_name”)
EN

Stack Overflow用户
提问于 2014-02-21 11:43:45
回答 3查看 2.7K关注 0票数 0

我正在编写python模块,并使用其他不同模块的许多导入。我有点困惑,我是应该在打开文件时导入所有必要的依赖模块,还是在必要时导入它。

我还想知道两者的含义。

我来自C++后台,所以我对这个特性感到非常兴奋,没有看到任何不使用__import__()的理由,只在我的函数中需要时才导入模块。

请在这件事上放点光。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-21 11:53:28

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

代码语言:javascript
复制
#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)

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

代码语言:javascript
复制
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,这里是一次我发现的讨论,大部分时间您应该坚持在文件的顶部导入。

票数 1
EN

Stack Overflow用户

发布于 2014-02-21 11:54:08

首先,通常在任何地方都不需要__import__。它的主要目的是支持动态导入那些你事先不知道的东西(比如插件)。您可以很容易地在函数中使用import语句:

代码语言:javascript
复制
import sys

def foo():
    import this

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

提前导入所有东西的主要优势是这是最习惯的。。在这里,阅读您的代码的人会去查看是否导入了某些内容。而且,您不需要在每个使用import os的函数中编写os。这种办法的主要缺点是:

  • 您可以进入无法解析的导入循环(A imports B,它导入A)
  • 即使你不打算使用它,你也会把所有的东西都拉进记忆里。

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

如果遇到第一个问题,这很可能是分组错误的代码的一个症状,应该将常见的内容分解到一个新的模块C中,AB都可以使用这个模块。

票数 1
EN

Stack Overflow用户

发布于 2014-02-21 12:09:09

首先,它违反了使用导入内部函数的PEP8。调用import --即使模块已经加载,这也是一个昂贵的调用,因此,如果您的函数将被多次调用,这将不会补偿性能的提高。

此外,当您调用“导入测试”python时,请执行以下操作:

dataFile = __ import__('test')

导入在文件顶部的唯一缺点是名称空间受到了非常快的污染,这取决于文件的复杂性,但是如果您的文件太复杂,这是一个错误设计的信号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21933555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档