python实现控制模块可以导出的内容
作者:无风听海
Python模块通过__all__列表控制import*导出内容,使用_前缀隐藏内部函数,__magic__为特殊符号,推荐明确API并合理使用命名空间
在 Python 中,我们可以通过在模块中定义 __all__
列表,控制该模块通过 from module import *
导出的内容。
1. 使用__all__控制导出
# 文件:my_module.py __all__ = ['func1', 'MyClass'] # 只允许导出这些 def func1(): pass def func2(): pass # 不会被 * 导入 class MyClass: pass
然后在其他地方:
from my_module import * func1() # ✅ 可以使用 MyClass() # ✅ 可以使用 func2() # ❌ NameError: name 'func2' is not defined
说明:
__all__
是一个字符串列表,定义了从这个模块使用from xxx import *
时,能导入的名称。- 对
import my_module
和from my_module import func2
没有影响,它们仍然可以访问不在__all__
中的成员。
2. 手动控制命名空间
如果你不想别人通过 from my_module import *
看到你内部函数,可以:
def _internal_helper(): # 这是内部函数,不打算对外暴露 ... def public_func(): ...
在 Python 中,以单下划线开头的变量或函数名(如 _internal_helper
)默认不会被 import *
导入。
3. 私有 vs 公有符号建议
名称形式 | 是否默认导出(被 * 看到) | 用途建议 |
---|---|---|
func1 | ✅ 是 | 公共 API |
_helper_func | ❌ 否 | 模块内部工具函数 |
__magic__ | ❌ Python 保留 | 特殊用途 |
__all__ | ✅ 手动控制 | 导出白名单 |
示例:更完整的模块设计
# mymath.py __all__ = ['add', 'multiply'] def add(x, y): return x + y def multiply(x, y): return x * y def _debug_log(x): print(f"Debug: {x}")
用户代码:
from mymath import * add(2, 3) # ✅ multiply(2, 3) # ✅ _debug_log(1) # ❌ NameError
总结
控制方式 | 效果 | 推荐使用场景 |
---|---|---|
__all__ = [...] | 限制 import * 能导出的内容 | 公开 API 明确时 |
前缀 _ | 默认隐藏,不导出 | 工具函数、私有变量 |
import xxx | 无限制,访问完整模块命名空间 | 推荐日常用法 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。