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 编写模块或引用外部模块时,只需要了解它的使用规则和限制,就能达到想要的效果。