如何构建Python包以实现便捷的函数导入?
实现自定义包的直接函数调用
要实现import my_functions as mf后直接用mf.func1(arg)调用函数,核心是修改包的__init__.py文件,将子模块中的函数暴露到包的顶层命名空间,具体步骤如下:
1. 修改src/__init__.py
打开my_functions/src/__init__.py,添加以下代码(根据你的实际函数名调整):
# 从各个子模块导入需要暴露的函数 from .func1 import func1 from .func2 import func2 from .func3 import func3 # 可选:定义__all__,控制`from my_functions import *`时导入的内容 __all__ = ["func1", "func2", "func3"]
这样当你导入my_functions包时,这些函数会直接挂载在包的命名空间下,无需单独导入子模块。
2. 确保包正确安装
如果是本地开发场景,需要将包以可编辑模式安装,确保Python能识别到my_functions包:
- 在
my_functions根目录下创建pyproject.toml文件,内容示例:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_functions" version = "0.1.0" packages = ["src"] package_dir = {"": "src"}
- 打开终端,进入
my_functions根目录,执行:
pip install -e .
-e参数表示可编辑模式,后续修改代码无需重新安装。
3. 验证调用
现在就可以按照预期方式调用函数了:
import my_functions as mf a = mf.func1(arg) b = mf.func2(arg)
进阶说明
- 如果你想暴露模块而非单个函数(比如
mf.func1.some_util()),可以在__init__.py中导入模块:from . import func1,但这样调用方式会变成mf.func1.func1(arg),不符合你的需求。 - 避免使用
from .func1 import *这种批量导入方式,容易引发命名冲突,显式导入需要的函数更清晰可控。
内容的提问来源于stack exchange,提问作者KevOMalley743
相关产品推荐
相关产品推荐

