Python 观察者模式:示例、技巧? [关闭]

2023-11-26

有没有用 Python 实现的 GoF Observer 的示例?我有一些代码,当前有一些通过关键类进行调试的代码(如果设置了 magic env,则当前会生成到 stderr 的消息)。此外,该类还有一个接口,用于增量返回结果并将它们存储(在内存中)以进行后处理。 (该类本身是一个作业管理器,用于通过 ssh 在远程计算机上并发执行命令)。

目前该类的用法如下所示:

job = SSHJobMan(hostlist, cmd)
job.start()
while not job.done():
    for each in job.poll():
        incrementally_process(job.results[each])
        time.sleep(0.2) # or other more useful work
post_process(job.results)

另一种使用模型是:

job = SSHJobMan(hostlist, cmd)
job.wait()  # implicitly performs a start()
process(job.results)

这对于当前的实用程序来说一切正常。但它确实缺乏灵活性。例如我目前支持简短的输出格式或进度条作为增量结果,我也支持 简短、完整和“合并消息”输出post_process()功能。

但是,我想支持多个结果/输出流(终端的进度条、日志文件的调试和警告、从成功作业到一个文件/目录的输出、错误消息和从不成功作业到另一个文件/目录的其他结果) , ETC)。

这听起来像是需要观察者的情况……让我的类的实例接受来自其他对象的注册,并在发生特定类型的事件时回调它们。

我正在看PyPubSub因为我在相关问题中看到了一些对此的引用。我不确定我是否准备好将外部依赖项添加到我的实用程序中,但我可以看到使用他们的界面作为我的模型的价值,如果这将使其他人更容易使用。 (该项目旨在作为独立的命令行实用程序和用于编写其他脚本/实用程序的类)。

简而言之,我知道如何做我想做的事……但是有很多方法可以实现它。我想要关于从长远来看什么最有可能对代码的其他用户有用的建议。

代码本身位于:classh.


但它确实缺乏灵活性。

嗯...实际上,如果您想要异步 API,这对我来说看起来是一个很好的设计。通常是这样。也许您需要的只是从 stderr 切换到 Pythonlogging模块,它有自己的一种发布/订阅模型,用什么Logger.addHandler()等等。

如果您确实想支持观察员,我的建议是保持简单。您实际上只需要几行代码。

class Event(object):
    pass

class Observable(object):
    def __init__(self):
        self.callbacks = []
    def subscribe(self, callback):
        self.callbacks.append(callback)
    def fire(self, **attrs):
        e = Event()
        e.source = self
        for k, v in attrs.items():
            setattr(e, k, v)
        for fn in self.callbacks:
            fn(e)

你的 Job 类可以子类化Observable。当发生感兴趣的事情时,请致电self.fire(type="progress", percent=50)或类似的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 观察者模式:示例、技巧? [关闭] 的相关文章

随机推荐