这是滥用的尝试/除外?

时间:2013-11-06 20:34:23

标签: python-2.7 messaging

这似乎会做它'需要做'的事情,但我觉得这是一个不好的捷径。我的意思是我们拥有所有这些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()

这并不直接导致家庭成员或任何事情的死亡,但它是否善于尝试/除了 - 或者更重要的是,它是否被认为是“pythonic”以这种方式做到这一点?

我问,因为我觉得好像我通常会看到try / except而不是类型检查:我们希望将对象视为某种类型,并且当它失败时我们会正确处理它。所以看起来使用try / except来确保我们遍历列表或dict,而不是使用它来调用方法然后正确地失败/忽略'not-a-message'。正确?

1 个答案:

答案 0 :(得分:0)

您所描述的内容可以以有限的方式模拟pub-sub - 我认为这是一个最小的测试框架。但是你错过了生产中需要的一些重要方面:

  • 异步处理。在诸如Twisted之类的异步框架中,使用promises和callback来强制执行操作的相对顺序,但允许某些操作在其他人等待时进行处理。
  • 聚类。使用您的方法,一切都必须在一个进程/线程内发生。如果您使用代理执行pub-sub,则可以在不更改任何工作程序代码的情况下进行集群(假设工作程序代码设计正确)。