模块级导入还是函数级导入?

2024-09-26 17:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

哪种款式比较好?

样式A:

def foo():
    import some_module
    some_module.something

B型:

import some_module

def foo():
    some_module.something

假设some_module不在代码的其他地方使用,只在这个函数中使用。


Tags: 函数代码importfoodef地方样式some
2条回答

事实上,如前所述,通常最好遵循PEP8建议,并在顶部进行导入。不过也有一些例外。理解它们的关键在于你在第二段中嵌入的问题:“在什么阶段导入。。。发生了吗?”

Import实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都将运行。“def”也是一个可执行语句;它的执行会导致定义的名称与(已编译的)代码相关联。如果你有:

def f():
    import something
    return None

在导入的模块中,(编译的)import和return语句在此时与名称“f”关联。当您runf()时,会运行import语句。

如果延迟导入“非常大”或“很重”的内容,然后再也不运行该函数(在本例中为f),则导入将永远不会发生。这节省了时间(也节省了一些空间)。当然,一旦您真正调用了f(),就会发生导入(如果在Python使用缓存的结果时已经发生了导入,但它仍然必须检查),这样您就失去了时间优势。

因此,根据经验,在你做了大量的分析并发现导入“拥抱”在90%的跑步中浪费了很多时间,而在10%的跑步中却节省了一点时间之前,“导入顶部的所有内容”。

PEP 8建议所有导入都发生在模块的顶部。所有名称(包括绑定到模块的名称)都按此顺序在本地、非本地、全局和内置作用域中搜索。

相关问题 更多 >

    热门问题