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 | 无限制,访问完整模块命名空间 | 推荐日常用法 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
