相对导入模块场景下,如何仅执行模块初始化而不导出内容?
解决方法
嘿,这个需求其实很好满足——你只需要在subpackage/__init__.py里直接导入整个spam模块就行,不用指定要导出的具体对象,这样Python就会自动执行spam.py里的初始化代码了。
两种导入方式的具体写法
相对导入(更推荐,适配你早期开发的场景):
直接在__init__.py里加一行:from . import spam这种写法不会把spam里的对象暴露到subpackage的命名空间中,单纯只是触发spam.py的执行。
绝对导入:
如果想用绝对路径的方式,写法是:from package.subpackage import spam
原理说明
Python在导入模块时,会执行该模块内的所有顶层代码——也就是你写的那些初始化逻辑(比如配置初始化、全局变量设置、注册回调等),不管你有没有显式导出模块里的对象。而我们上面的写法只是导入模块本身,不会把spam里的eggs、beans之类的内容带到__init__.py的命名空间里,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者c z
相关产品推荐
相关产品推荐

