python中的“__all__ ”作用

1. __all__ 的定义

在 Python 中有一种特殊的用法:使用“__”(双下划线)来定义特殊变量和特殊函数,而 __all__ 就是其中之一。

__all__ = ['module_name', 'variable_name']

这行代码表示该模块中导出可供使用的名称。__all__ 所定义的名称必须存在于模块中,否则会报出错误。

2. __all__ 的作用

有时候我们会有这样的情况:一个模块中定义了很多不同的函数和变量,但是我们只希望暴露其中的部分函数和变量给外部使用。

这时候,使用 __all__ 就能够起到筛选的作用:

当我们将模块通过 import 引入时,只能使用 __all__ 定义的函数和变量,而不是其他未被定义的。

若未定义 __all__,则默认返回模块中所有名称。

2.1 __all__ 做动态绑定效果

__all__ 不仅可以用于模块外调用,还可以在模块内部中使用

```__all__``` 可以实现动态绑定的效果。即在代码运行时,可以通过模块名来挂在模块属性。

下面的代码演示了这个过程:

MODULE_VARIABLE = 1

__all__ = ["MODULE_VARIABLE"]

def dynamic_binding():

globals()[__name__ + ".MODULE_FUNCTION"] = lambda: 2

dynamic_binding() # 动态绑定 MODULE_FUNCTION

print(MODULE_VARIABLE) # 1

print(MODULE_FUNCTION()) # 2

2.2 __all__ 和 from-import 的结合使用

from-import 可以让我们在使用的时候只导入单个或多个特定的函数或变量。

当定义了 __all__ 时,可以避免异常导入未定义过的模块,进而提高代码可维护性和安全性。

示例代码:

# file: module.py

def print_hello():

print('Hello, world!')

def print_goodbye():

print('Goodbye!')

__all__ = ['print_hello'] # 只导出 print_hello 供外部调用

# file: app.py

from module import print_hello, print_goodbye # 只从 module 模块中导入 print_hello 函数

print_hello() # 正常,输出 'Hello, World!'

print_goodbye() # 报错,module 模块中没有 print_goodbye 函数

3. 总结

__all__ 是 Python 脚本语言的特殊变量之一,它的使用可以限制代码的访问范围,达到保护变量作用域和安全性的目的,同时也有促进代码模块化,提高代码的可读性和可维护性的作用。

__all__ 的使用方法比较简单,可以灵活运用于多种场景中。我们在使用 Python 编写模块或引用外部模块时,只需要了解它的使用规则和限制,就能达到想要的效果。

后端开发标签