【问题标题】:How to only pay the dependency penalty for the implementation you use in Python?如何只为你在 Python 中使用的实现支付依赖惩罚?
【发布时间】:2011-01-25 12:26:06
【问题描述】:

我有一组相当简单的功能,我有多个实现,例如,可以由 Redis、MongoDB 或 PostgreSQL 支持的数据存储。我应该如何构造/编写我的代码,以便想要使用其中一种实现的代码只需要该实现的依赖项,例如,如果他们使用 Redis 后端,则不需要安装 psycopg2

这是一个例子。假设以下模块,example.py

class RedisExample(object):
    try:
        import redis
    except ImportError:
        print("You need to install redis-py.")

    def __init__(self):
        super(RedisExample, self).__init__()

class UnsatisfiedExample(object):
    try:
        import flibbertigibbet
    except ImportError:
        print("You need to install flibbertigibbet-py")

    def __init__(self):
        super(UnsatisfiedExample, self).__init__()

这是我的 Python shell 体验:

>>> import example
You need to install flibbertigibbet-py

交替:

>>> from example import RedisExample
You need to install flibbertigibbet-py

我真的希望在尝试实例化UnsatisfiedExample 之前我没有收到该错误。有什么常见的方法来解决这个问题吗?我曾考虑将example 制作成一个包,每个后端都有自己的模块并使用工厂函数,但我想确保我没有错过更好的东西。

谢谢。

【问题讨论】:

  • 在拥有如此出色的代表之后,您的整个问题都在标题中......?
  • 这可能有助于集中标题并在正文中提供详细信息。细节帮助,一些几乎可以工作的代码来显示你希望发生的事情通常很有帮助。
  • 对不起,我有一个新生儿,所以专注的能力前一分钟在这里,下一分钟就消失了。我会尝试修改。

标签: python import dependencies


【解决方案1】:

不能简单的把import语句放在每个类的__init__方法中吗?然后在您尝试创建实例之前它不会运行:

class UnsatisfiedExample(object):
    def __init__(self):
        try:
            import flibbertigibbet
        except ImportError:
            raise RuntimeError("You need to install flibbertigibbet-py")
        super(UnsatisfiedExample, self).__init__()

【讨论】:

  • 此外,您可以将 lib 存储在实例变量中,以便稍后在您的类中访问它:try: import flibbertigibbet; self.fg = flibbertigibbet
【解决方案2】:

import 只是另一个声明,例如 forwith。将其放在if 语句中,可能位于抽象类后面。

【讨论】:

  • 我修改了问题以提供更多细节。您能否发布一个您提到的抽象类想法的示例,以及这将如何解决我(希望现在更清楚)的担忧?
  • 我的答案没有改变。需要时执行导入。
  • 您是否建议客户端代码只执行from example import RedisExample 而不是import example?因为这也会触发ImportError
  • ... 不,我建议您在需要时导入它。如,就在您需要访问其中的名称之前。
猜你喜欢
  • 2010-10-07
  • 2012-05-12
  • 2020-07-18
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2019-10-18
  • 2018-01-27
相关资源
最近更新 更多