Python 中的 __all__

1 __all__ 的作用

  • __all__ 是模块公开接口的一种约定, 格式如下 : __all__ = ["foo", "bar"]

  • Python 没有原生的可见性控制,其可见性的维护是靠一套需要大家自觉遵守的”约定“,比如,下划线开头的变量对外部不可见

  • 如果定义了__all__,其他文件中使用from xxx import *导入该文件时,只会导入 __all__ 列出的成员,可以其他成员都被排除在外

# test1.py
__all__ = ['func']
def func():
    pass

#test2.py
__all__ = ['func2', 'test1']
def func2():
    pass
def func22():
    pass

# test3.py
from test2 import *

>>> func2() # 正常使用
>>> test1.func() # 正常使用
>>> func22() # 不能使用

2 __all__ 的一些小知识

2.1 控制 from xxx import * 的行为

python不提倡用 from xxx import * 这种写法。如果一个模块 xxx 没有定义 __all__,执行 from spam import * 时会将 xxx 中所有非下划线开头的成员(包括该模块import的其他模块成员)都会导入当前命名空间,这样就可能弄脏当前的命名空间。显式声明了 __all__,import * 就只会导入 __all__ 列出的成员,如果 __all__ 定义有误,还会明确地抛出异常,方便检查错误

2.2 为 lint 等代码检查工具提供辅助

编写库时,经常会在 __init__.py 中暴露整个包的 API,而这些 API 的实现可能是在包的其他模块中。如果仅仅这样写:from xxx import a, b,一些代码检查工具,如 pyflakes 会报错,认为变量 a和 b import 了但没被使用。一个可行的方法是把这个警告压掉:from xxx import a, b # noqa (No Q/A,即无质量保证),但更好的方法是显式定义 __all__,这样代码检查工具就会理解,从而不再报 unused variables 的警告

3 __all__ 的注意事项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值