Python如何通过相对导入将当前模块__init__.py导入指定命名空间
可用实现方案
你可以通过Python标准库importlib的动态导入能力实现需求,完全不需要硬编码外层模块名称,也不需要重构现有代码结构:
实现代码(在submodule.py中使用)
import importlib # 动态获取当前所属的包模块,等价于导入外层的__init__.py outer_module = importlib.import_module(__package__) # 本地同名变量不会被覆盖 SOME_CONSTANT_ONE = "one!" def do_work(): print(SOME_CONSTANT_ONE) # 输出 "one!" print(outer_module.SOME_CONSTANT_ONE) # 输出 1
原理解释
- 每个Python子模块运行时都会自动被赋值
__package__属性,该属性的值就是当前子模块所属的顶层包名称,比如mymodule.submodule的__package__值就是mymodule,就算后续你修改外层包名,这个属性会自动同步更新,不会失效。 importlib.import_module方法可以根据传入的包名字符串动态导入对应模块,导入后绑定到你指定的变量名(这里是outer_module)上,所有__init__.py中定义的常量、函数都会挂载在这个变量的命名空间下,不会污染当前文件的作用域,新增常量也不需要修改导入语句,可维护性符合要求。
内容的提问来源于stack exchange,提问作者mngeek206
相关产品推荐
相关产品推荐

