📜  __all__ python (1)

📅  最后修改于: 2023-12-03 14:59:09.880000             🧑  作者: Mango

Python all

Python有一个重要的变量__all__,它定义了在使用from module import * 时,能够导入指定的模块成员。在本文中,我们将深入了解__all__变量的作用和用法。

__all__的作用

Python中__all__是一个可选的变量,它定义了一个模块的接口,即对外暴露哪些成员,哪些是内部使用的。它的作用有两个方面:

  1. 限制使用from module import * 语句导入的成员。
  2. 作为import * 语句时,dir() 函数返回的成员列表。
__all__的使用方法

想要使用__all__变量,需要满足以下几个条件:

  1. __all__ 只在 from module import * 语句中起作用。
  2. __all__中的成员必须是模块中定义的有效变量、函数、类或子模块等对象。
  3. __all__可以是一个列表,也可以是一个字符串列表,列表元素为字符串,表示模块中暴露给外部使用的名称。
  4. Python解释器并不会执行 __all__ 中的成员,它只用于在 from module import * 语句的情形下限制导入的成员。
  5. __all__ 中的名称如果以 _ 开头,它们不会被 from module import * 导入,除非它们在 __all__ 中显式地启用。

在模块中声明__all__的方法如下所示:

__all__ = ['func1', 'func2', 'class1', ...]

或者,如果名称很多,可以将它们放在字符串列表中,如下所示:

__all__ = ['func1', 'func2',
           'class1', 'class2',
           'submodule1', 'submodule2']
__all__ 的例子

我们来看看一个例子,对于下面这个模块:

# module.py
def func1():
    pass

def func2():
    pass

def _private_func():
    pass

我们在module.py中添加__all__变量:

# module.py
__all__ = ["func1", "func2"]
def func1():
    pass

def func2():
    pass

def _private_func():
    pass

当我们使用命令from module import * 时,只会导入func1func2两个函数:

>>> from module import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__',
 '__spec__', 'func1', 'func2']

>>> _private_func()
NameError: name '_private_func' is not defined

这样做的好处是,避免了将开发者使用不应该使用的私有部分,同时也简化了使用者的语义。对于大型的模块,使用__all__能够显著提高可维护性。

总结

__all__是Python中的一个非常有用的功能,它定义了模块对外的接口,同时也限制了from module import * 语句的行为。在大型项目中,使用__all__能够有效地提高模块的可维护性和可读性。我们要注意,虽然__all__有它的限制条件,但它会为我们提供有用的帮助,因此应该在写模块时考虑使用__all__

以上是Python __all__的介绍,希望对您有所帮助!