You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建仅暴露函数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:42:33