python - 是否有 Pythonic 泛型 "null dependency"?

标签 python dependencies

我经常发现自己处于类具有可选依赖项的情况。比如下面的notifier

class Example(object):
    def __init__(self, notifier=None):
        self._notifier = notifier or DummyNotifier()

    def doTheBusiness(self):
        doSomeWork()
        self._notifier.notifyComplete()

因为 notifier 是可选的,我有两个选择:

  • 如果未提供notifier,则在其位置放置一个DummyNotifier(按照上面的示例),其中DummyNotifier 是不执行任何操作的依赖项
  • doTheBusiness 中,在调用任何东西之前检查 notifier 是否为 None

为了代码可读性,我更喜欢第一种选择,但它涉及到必须为每个依赖项(尽管非常小)编写一个实现。

为了避免这种情况,我一直在考虑如下通用依赖项:

class GenericDependency(object):
    def generic(self, *args, **kwargs):
        pass
    def __getattr__(self, _):
        return self.generic

然后我可以对此调用任何方法:

gd = GenericDependency()
gd.notifyComplete()
gd.anythingElse("also", "works", "with", any="arguments")

(这显然只适用于操作 - 不适用于需要返回值的函数。)

我的问题 - (1) 这是 Pythonic (2) 有更好的方法吗?

最佳答案

我会说 1) 是一个有效的解决方案,也称为 Null Object Pattern .
我看到另一种可能的解决方案:
1) 移除依赖并在Example类之外调用notifier,即在调用doTheBusiness
之后 2)也许使用Obeserver Pattern

关于python - 是否有 Pythonic 泛型 "null dependency"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767666/

相关文章:

python - 如何使用openCV检测卫星航拍图像中的街道线?

python - 从字典中调用特定值

python - Python GTK+ 3 教程 Hello World 中没有名为 'gi' 的模块

java - 对于maven依赖,如何找出哪个Java类中的哪个导入来自它?

android - 无法解析 : com. android.support :support-compat:27. 2.0

Gradle 找不到不存在的前缀版本传递依赖

Python:当子属性满足条件时提取XML元素值

python - 在多个内核上运行 python 线程

intellij-idea - Intellij 模块依赖项导出选项

node.js - 运行 yeoman 生成器后安装 Bower 包