【发布时间】:2018-07-01 20:20:36
【问题描述】:
我目前正在为 Python 2.7 开发一组抽象模块,我将把它作为一个 python 包发布:
myabstractpkg
- abstract
- core
- logging
- ...
- nodes
- ...
这些模块将在一组完全不同的包中实现:
myimppkg
- implementation
- core
- logging
- ...
- nodes
- ...
然而,在运行时,我希望能够在使用已实现模块的工具中始终像这样进行导入:
from myabstractpkg.api import nodes
from myabstractpkg.api.core.logging import Logger
这样,开发人员总是从“虚拟”api 模块导入,然后由该模块决定导入器的实际指向位置。
我知道我可以通过修改模块 dict 以某种方式破解它:
from myimppkg import implementation
sys.modules["myabstractpkg.api"] = implementation
或者对myabstractpackage.api 的__init__.py 中的所有内容进行巧妙的导入,但这对我来说感觉有点脆弱。
我想知道你们是否对最好的方法有一些意见。对于整个重新映射模块的事情,我可能会走上一条非常丑陋的轨道,所以如果你们有任何更智能、更 Python 的解决方案,对于我的 API 抽象、实现、使用方法,我很想听听。
【问题讨论】:
-
嗨 Matthew,我已经在使用入口点来注册我的实现包。但是,我不知道如何处理这些导入的映射,因此开发人员总是会使用那个 api 包进行导入。在
Application A中,它们应该自动使用Implementation A,而在Application B中,脚本应该始终使用Implementation B。 -
cpython 的
decimalmodule does this。原因不同(如果找不到 c 扩展名,它会依赖 python 实现),但try/except ImportError方法可能值得考虑。 -
@Tim 您能否将您现有的入口点代码添加到问题中,以便我们了解已经完成的工作?
-
你为什么要为 Python 2 编写一个新包?
标签: python python-2.7 python-import