在模块级别或功能级别导入?

wim*_*wim 19 python import scope module function

哪种风格更好?

风格A:

def foo():
    import some_module
    some_module.something
Run Code Online (Sandbox Code Playgroud)

风格B:

import some_module

def foo():
    some_module.something
Run Code Online (Sandbox Code Playgroud)

假设some_module 代码中的其他地方没有使用,只在此函数内部使用.

tor*_*rek 32

实际上,正如已经指出的那样,通常最好遵循PEP 8的建议并在顶部进行进口.但也有一些例外.理解它们的关键在于你的第二段中的嵌入式问题:"在什么阶段导入......会发生什么?"

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

def f():
    import something
    return None
Run Code Online (Sandbox Code Playgroud)

在您导入的模块中,(编译的)import和return语句在该点与名称"f"相关联.运行 f()时,会运行 import语句.

如果你推迟导入"非常大"或"重"的东西,然后你永远不会运行该函数(在这种情况下为f),则导入永远不会发生.这节省了时间(以及一些空间).当然,一旦你实际调用f(),就会发生导入(如果Python使用缓存结果时已经发生了,但它仍然需要检查),这样你就失去了时间优势.

因此,根据经验,"在顶部导入所有内容"直到您完成大量分析并发现导入"巨大的东西"在90%的运行中浪费了大量时间,而节省了一点时间其中10%.


Ign*_*ams 9

PEP 8建议所有导入都发生在模块的顶部.所有名称,包括绑定到模块的名称,都按照该顺序在本地,非本地,全局和内置范围中搜索.