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

标签 python function import module scope

哪种风格更可取?

样式 A:

def foo():
    import some_module
    some_module.something

样式 B:

import some_module

def foo():
    some_module.something

假设 some_module 没有在代码的其他地方使用,只在这个函数内部使用。

最佳答案

确实,如前所述,通常最好遵循 PEP 8 建议并在顶部进行导入。不过也有一些异常(exception)。理解它们的关键在于您在第二段中嵌入的问题:“导入在什么阶段......发生?”

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

def f():
    import something
    return None

在您导入的模块中,(已编译的)导入和返回语句此时与名称“f”相关联。当您运行 f() 时,那里的 import 语句就会运行。

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

因此,根据经验,“在顶部导入所有内容”,直到您完成大量分析并发现导入“巨大”在 90% 的运行中浪费大量时间,而不是节省其中 10% 的时间很少。

关于python - 在模块级别或功能级别导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9614051/

相关文章:

javascript - 如何在不预先定义的情况下将javascript函数传递给另一个函数?

python - 如何将我的函数放入类中。Beginner

java - Eclipse中导入类的问题

mysql - 将数千条记录从单个 txt 文件导入数据库 MySQL 的更快方法?

python - SQL 注入(inject)保护是否内置于 SQLAlchemy 的 ORM 或核心中?

Python PostgreSQL psycopg2 将列连接到新列

用于多处理的 Python 共享字符串内存

python - Numpy:如何获取两个矩阵中不同的项?

function - 在 PowerShell 中查看嵌套私有(private)函数定义

python - 没有名为 pyglet 的模块