2

这似乎会做它“需要做的”,但我觉得这是一个糟糕的捷径。我的意思是我们拥有所有这些 pub-sub 库是有原因的,对吧?

def fakeMessagePasser(myFunction, listOfListeners):
    for obj in listOfListeners:
        try:
            success = getattr(obj, myFunction)()
        except AttributeError:
            handleTheSituationCorrectly()

我知道 Python 更喜欢请求宽恕而不是许可,但如果是这样的话,为什么人们首先会为“复杂”的基于订阅的对象消息传递库而烦恼呢?似乎该语言天生就可以处理这个问题 - 但正如经常发生的那样,我可能只是在我的知识中有一个很大的漏洞,否则会告诉我为什么这是一件坏事。

这甚至是好的 - 或者换句话说,有意的 - 应用 try/except 吗?就像,如果我们在一个游戏循环中,我们看到了这样的事情:

#incoming pseudocode, not based on anything in particular
for enemy in objectQueue:
    if enemy.hasGoodGuyInSights():
        try:
            enemy.attack()
        except AttributeError: ##maybe this object has no attack method, it just 'follows' or something, who knows why bad guys do anything really
            handleTheSituationCorrectly()

这不会直接导致家庭成员的死亡或其他任何事情,但它是否很好地使用了 try/except - 或者更重要的是,以这种方式这样做是否被认为是“pythonic”?

我问是因为我觉得我通常会看到 try/except 代替类型检查:我们希望将对象视为某种类型,并且当失败时我们会正确处理它。因此,使用 try/except 来确保我们遍历列表或 dict 与使用它来调用方法然后正确地失败/忽略“不是消息”之间似乎存在差异。正确的?

4

1 回答 1

0

您所描述的可以以有限的方式模拟 pub-sub - 我认为对于最小的测试框架来说已经足够了。但是您错过了生产中需要的一些基本方面:

  • 异步处理。在 Twisted 等异步框架中,promise 和回调用于强制执行操作的相对顺序,但允许一些操作处理而另一些操作等待。
  • 聚类。使用您的方法,所有事情都必须在一个进程/线程中发生。如果您使用代理进行发布-订阅,您可以在不更改任何工作代码的情况下进行集群(假设工作代码设计正确)。
于 2013-11-06T20:41:31.627 回答