【问题标题】:Python 2.7: Dynamic module import in an imported module based on given variablePython 2.7:基于给定变量的导入模块中的动态模块导入
【发布时间】:2016-08-15 05:29:36
【问题描述】:

有两个版本的存储。根据版本,我需要选择合适的接口模块才能得到结果。

文件结构如下:

lib/
    __init__.py
    provider.py
    connection.py
    device.py

    storage/
        __init__.py
        interface_v1.py    # interface for storage of version 1
        interface_v2.py    # interface for storage of version 2

main.py

main.py 导入 provider.py,它应该导入 storage 子包中列出的接口之一,具体取决于存储的版本。

main.py:

from lib.provider import Provider
from lib.connection import Connection
from lib.device import Device

connection = Connection.establish(Device)
storage_version = Device.get_storage_version()

massage = Provider.get_data(connection)

provider.py 应该基于storage_version 导入一个存储接口并实现提供一些功能:

from storage import interface

class Provider(object):

    def __init_(self):
        self.storage = interface.Storage

    def get_data(self, connection):
        return self.storage.get_data()

    def clear_storage(self, connection):
        self.storage.clear_storage()

这个例子并不完整,但应该足以解释问题。

补充问题:

  • 是否可以使用storage.__init__ 仅使用导入 分包?
  • 如何在 Python 中正确实现 Factory?

【问题讨论】:

  • 您为实际尝试解决问题做了哪些工作,哪些工作没有解决?
  • @kindall:其实问题是storage_version不知道怎么导入接口。正常的动态导入在这里是行不通的,因为 storage_version 是在 provider 模块导入之后定义的。
  • 拥有 Provider1 和 Provider2 类并使用工厂或类似的东西来获取相应的提供程序实例你知道 storage_version 之后怎么样?我看到不需要动力。
  • @JL Peyret:这可能是解决方案。因为提供者的代码几乎相同,所以我想要一个类,但可能它们可以从一个公共基类继承。

标签: python python-2.7 python-import python-module


【解决方案1】:

假设interface_v1interface_v2 bith 实现了一个类StorageClass我猜是这样的:

import storage.interface_v1
import storage.interface_v2

class Provider(object):

    def __init__(self , version):
        if version == 1:
           self.storage = storage.interface_v1.StorageClass
        else:
           self.storage = storage.interface_v2.StorageClass

将是最好的解决方案 - 但https://docs.python.org/2/library/functions.html#import 应该提供一种基于名称导入模块的方法。

【讨论】:

  • 也同意。无需繁琐的动态加载,如果需要,您可以同时提供两个存储版本。
猜你喜欢
  • 2015-04-04
  • 2017-06-19
  • 2021-10-22
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多