如何构建仅暴露函数的Python本地库?避免模块文件可见
解决Python库仅暴露函数、隐藏内部模块的方案
步骤1:重命名内部模块为私有格式
将承载函数的my_functions.py重命名为_my_functions.py,下划线开头的模块名遵循Python内部实现的命名约定,默认不会被视为对外暴露的接口。
步骤2:修改__init__.py动态收集并导入函数
替换原__init__.py内容为以下代码,自动收集内部模块中的所有函数,同时隐藏内部模块的引用:
import inspect from . import _my_functions # 自动收集模块中的所有函数 public_functions = [ name for name, obj in inspect.getmembers(_my_functions) if inspect.isfunction(obj) ] # 将函数注入到当前库的命名空间 for func_name in public_functions: globals()[func_name] = getattr(_my_functions, func_name) # 定义对外暴露的函数列表,控制from my_library import *的行为 __all__ = public_functions # 删除内部模块的引用,避免被外部访问 del _my_functions # 自定义补全行为,仅显示对外暴露的函数 def __dir__(): return __all__
步骤3:验证效果
重新安装库后,在Python环境中测试:
import my_library # 正常调用函数 my_library.send_hi() # 输出: Hi! # 尝试访问内部模块会触发错误 my_library._my_functions # AttributeError: module 'my_library' has no attribute '_my_functions' # Tab补全仅显示对外暴露的函数,不会出现内部模块名
原理说明
- 私有模块命名:
_my_functions.py的命名方式会提示用户这是内部实现,不应直接依赖。 - 动态函数收集:通过
inspect模块自动识别模块中的函数,无需手动维护函数列表,适配函数动态变化的场景。 - 隐藏模块引用:删除
__init__.py中对_my_functions的引用,阻止通过库命名空间直接访问内部模块。 - 自定义
__dir__:优化交互体验,让自动补全仅显示可用的函数接口。
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

