python导入多次

JON*_*402 8 python import python-3.4

我想这是一个普遍的问题,如果没有张贴在正确的地方,那就很抱歉.

比方说,我有一个a导入功能os.如果我要多次从另一个文件调用此函数,我假设导入也会多次执行?有没有办法只导入模块,如果它不存在?

基本上,我有一个类调用从各种文件导入的多个函数,而不是导入整个文件我认为它更容易导入只是函数但现在我想知道我是否会在长期与自己头痛进口过剩.

dim*_*-an 22

正如描述的蟒蛇文档中,当蟒蛇看到它下面的一些事情的import语句:

  • 如果已导入模块,则检查某些全局表
    • 如果未导入模块,则python导入它,创建模块对象并将新创建的模块对象放入全局表中
    • 如果模块被导入python只是获取模块对象
  • 当python有模块对象时,它会将它绑定到您选择的名称
    • 如果它是import foo模块的名称foo将是foo
    • 如果它是import foo as bar模块的名称foo将是bar
    • 如果它是from foo import bar as bazpython bar在模块中找到函数(或其他)foo并将此函数绑定到namebaz

所以每个模块只导入一次.

为了更好地理解导入机制,我建议创建玩具示例.

档案module.py:

print("import is in progress")

def foo():
    pass
Run Code Online (Sandbox Code Playgroud)

档案main.py:

def foo():
    print("before importing module")
    import module
    module.foo()
    print("after importing module")

if __name__ == '__main__':
    foo()
    foo()
Run Code Online (Sandbox Code Playgroud)

将上面的文件放在同一目录中.当module.py正在导入它打印import is in progress.当你启动main.py它会尝试导入module几次,但输出将是:

before importing module
import is in progress
after importing module
before importing module
after importing module
Run Code Online (Sandbox Code Playgroud)

因此导入只发生一次.您可以调整此玩具示例以检查您感兴趣的案例.

  • 太好了,非常清晰。还有一件事需要小心。如果稍后您使用 **as** 导入模块,例如“from module import foo as new_name”,则先前的模块名称将被覆盖,显示“全局名称“模块”未定义” (2认同)