📜  为什么在Python中 import star 是个坏主意(1)

📅  最后修改于: 2023-12-03 15:06:16.922000             🧑  作者: Mango

为什么在Python中 import star 是个坏主意

在Python中,import语句是一个非常常见的语句,用于将其他模块中定义的模块、函数或变量导入到当前的模块中。有时,我们会使用import *语句将一个模块中的所有函数和变量导入到当前的命名空间中。虽然这个语句看起来很方便,但实际上在实际编程中使用它是有风险的。这篇文章将解释为什么要避免使用import *语句。

什么是import *

import *语句是一个简写的语法,用于从一个模块中导入所有的公共声明(即不以下划线开头的声明)。例如,如果你有一个模块foo.py,其中定义了以下内容:

# foo.py
def a():
    pass

def _b():
    pass

c = 42

你可以使用以下方式导入它们中的所有内容:

from foo import *

这个语句将所有的公共声明(即a和c)导入到当前的命名空间中,但副作用也非常明显。

不要使用import *

虽然import *语句看起来很方便,但这个语句实际上是一个非常不好的编程风格,因为它有以下几个副作用:

命名空间污染

使用import *语句时,所有导入的名称都会自动添加到当前的命名空间中。这意味着如果你导入了许多名称,它们可能会覆盖你在当前命名空间中定义的其他名称。这样会导致难以调试和不稳定的行为。

代码维护的困难

使用import *语句时,你并不知道哪些名称被导入了,因此当你查看代码时很难理解它在做什么。这会增加代码的维护成本。

性能影响

虽然Python会缓存导入的模块,但是使用import *语句时,会导入整个模块的所有公共声明,这也会导致性能下降。

不可预测的行为

在Python中,代码的行为应该是可预测的。但当你使用import *语句时,代码行为变得不可预测。这是因为你在当前命名空间中定义的所有名称都可能会被覆盖。

因此,尽管import *是一个非常方便的语法,但在实际编程中应该避免使用它。

建议

在代码中建议使用以下方式导入模块中的内容:

from module_name import function_name, variable_name

这种方式很明确,也避免了命名空间污染和不可预测的行为。

总之,虽然import *语句在某些情况下会很方便,但在实践中,尽量避免使用它。这样可以避免代码维护方面的大量困难,并加强代码的可读性和可维护性。