Python包内无需指定模块名调用函数:如何保持原有调用方式?
保持包原有调用方式的规范实现方法
规范实现方法
要让用户继续沿用import mypack + mypack.callMe()的调用方式,核心是在mypack/__init__.py中把mycalls.py里的callMe函数导入到包的顶层命名空间,有两种实现方式:
显式导入指定函数(推荐)
在__init__.py中写入:from .mycalls import callMe这种方式直接明确对外暴露的接口,后续维护时一目了然。
通配符导入(不推荐)
即你提到的写法:from .mycalls import *
关于from .mycalls import *是否为良好实践
这不属于良好实践,原因如下:
- 存在命名冲突风险:通配符会导入
mycalls.py中所有未以_开头的名称,若后续其他模块出现同名函数,会直接覆盖原有名称,引发难以排查的bug。 - 对外接口不清晰:用户查看
__init__.py时无法直接知晓包对外提供的接口,不符合Python"显式优于隐式"的设计原则。 - API稳定性差:如果
mycalls.py后续新增其他函数,通配符会自动将这些新函数暴露出去,可能意外破坏依赖该包的原有代码。
内容的提问来源于stack exchange,提问作者bafly
相关产品推荐
相关产品推荐

