【问题标题】:import module_name Vs __import__('module_name')导入模块名与 __import__('module_name')
【发布时间】:2014-03-22 21:58:58
【问题描述】:

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

我也想知道两者的含义。

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

请对此有所了解。

【问题讨论】:

  • 你说的是在函数内部导入东西吗?因为这与__import__ 无关,所以您也可以使用import 来做到这一点。在这种情况下,这是 stackoverflow.com/q/5262406/395760 的副本

标签: python import


【解决方案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 中,这是运行相同导入语句时加速的查找表。

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

【讨论】:

  • 非常感谢您的解释!
  • @BhupeshPant 很高兴为您提供帮助;P
  • 在本地导入模块不是“好习惯”——它甚至违反了 pep8。
【解决方案2】:

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

import sys

def foo():
    import this

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

预先导入所有内容的主要优点是it is most customary。这就是阅读您的代码的人会去查看是否导入了某些内容的地方。此外,您不需要在使用os每个函数 中编写import os。这种方法的主要缺点是:

  • 您可能会陷入无法解决的导入循环(A 导入 B 导入 A
  • 即使您不打算使用它,您也会将所有内容都放入内存中。

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

如果您遇到第一个问题,这可能是代码分组不当的症状,应该将常见的东西放入一个新模块 C 中,AB 都可以使用。

【讨论】:

    【解决方案3】:

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

    另外,当您调用“导入测试”python 时,请执行以下操作:
    dataFile = __ import__('test')

    文件顶部导入的唯一缺点是命名空间会很快被污染,具体取决于文件的复杂性,但如果您的文件过于复杂,则表明设计不佳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 2012-03-31
      • 1970-01-01
      • 2011-10-29
      • 2014-06-15
      • 2015-10-06
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多