gpt4 book ai didi

python - 有条件映射的模块导入

转载 作者:行者123 更新时间:2023-12-01 09:17:18 25 4
gpt4 key购买 nike

我目前正在为 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 模块导入,然后由该模块决定将导入器实际指向何处。

我知道我也许可以通过修改模块字典将其组合在一起:

from myimppkg import implementation
sys.modules["myabstractpkg.api"] = implementation

或者对myabstractpackage.api__init__.py中的所有内容进行巧妙的导入,但这对我来说有点脆弱。

我想知道你们是否对执行此操作的最佳方法有一些意见。对于整个重新映射模块的事情,我可能处于一个非常丑陋的轨道上,所以如果你们有任何更智能、更Pythonic的解决方案,对于我的API抽象、实现、使用方法,我很乐意听到他们。

最佳答案

我相信使用 entry_points capabilities 可以为您提供最好的服务。 setuptools。因此,在具体实现之一的 setup.py 中,您将定义一个 entry_points ,如下所示:

setup(
name="concrete_extension"
entry_points={
"abstract_pkg_extensions": [
"concrete = concrete_extension"
]
}
}

然后你可以在你的抽象包中有一个扩展模块,它可以执行如下操作:

import pkg_resources
import os
import sys

from . import default

extensions = { "default": default }
extensions.update({e.name: e.load() for e in
pkg_resources.iter_entry_points("my_pkg_extensions")})

current_implementation_name = None
current_implementation = None

def set_implementation(name):
global current_implementation_name, current_implementation
try:
current_implementation = extensions[name]
current_implementation_name = name

# allow imports like from foo.current_implementation.bar import baz
sys.modules["{}.current_implementation".format(__name__)] = current_implementation
# here is where you would do any additional stuff
# -- e.g. --
# from . import logger
# logger.Logger = current_implementation.Logger
except KeyError:
raise NotImplementedError("No implementation for: {}".format(name))

set_implementation(os.environ.get("CURRENT_IMPLEMENTATION_NAME", "default"))

然后,您可以使用 ext.current_implementation 访问当前实现,并在导入之前在程序环境中设置您的实现,或者您可以显式调用 set_implementation在导入任何使用 ext.current_implementation 的子模块之前修改您的代码。

有关 sys.modules 条目及其工作原理的更多信息,请参阅 this question .

关于python - 有条件映射的模块导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com