Python 导入模块名称与导入(模块名称)

Python 导入模块名称与导入(模块名称),python,import,Python,Import,我正在编写一个python模块,并且正在使用许多其他不同模块的导入。 我有点困惑,是应该在打开文件时导入所有必要的依赖模块,还是应该在必要时导入 我还想知道两者的含义 我来自C++后台,所以我对这个特性感到非常兴奋,并且没有看到任何理由不使用·IpIXION()/CODE >,只在我的函数内需要时导入模块。 请对此加以说明。要编写更少的代码,请在脚本的第一行导入一个模块,例如: #File1.py import os #use os somewhere: os.path.chdir(some_

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

我还想知道两者的含义

我来自C++后台,所以我对这个特性感到非常兴奋,并且没有看到任何理由不使用<代码>·IpIXION()/CODE >,只在我的函数内需要时导入模块。


请对此加以说明。

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

#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)
有时您可能需要在本地(例如,在函数中)导入模块:

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


正如@bruno desthuilliers所提到的,导入Inside函数可能没有那么像pythonic,它违反了,在这里,您应该坚持在文件的顶部导入大部分时间。

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

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"
import sys

def foo():
    import this

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

提前导入所有内容的主要优势在于。在这里,人们阅读您的代码时会去查看是否导入了某些内容。此外,您不需要在每个使用
os
的函数中编写
import os
。这种方法的主要缺点是:

  • 您可以进入无法解决的导入循环(
    A
    imports
    B
    哪个导入
    A
  • 即使你不打算使用它,你也会把所有的东西都记在记忆里
第二个问题通常不是问题——您很少注意到导入对性能或内存的影响


如果遇到第一个问题,很可能是代码分组不当的症状,应该将常见的内容分解到新模块
C
,而
a
B
都可以使用。

首先,在函数内部使用导入违反了PEP8。 调用import是一个昂贵的调用,即使模块已经加载,因此如果函数将被多次调用,这将无法补偿性能增益。

另外,当您调用“导入测试”python时,请执行以下操作:
数据文件=_;导入__;('test'))


文件顶部导入的唯一缺点是名称空间会很快受到污染,这取决于文件的复杂性,但如果文件太复杂,则表明设计不好。

您是在谈论导入函数内部的内容吗?因为这与
导入无关,所以也可以通过
导入
来实现。在这种情况下,这是一个副本非常感谢您的解释@BhupeshPant很乐意帮忙;p在本地移植模块不是一种“良好做法”-甚至违反了pep8。