这似乎会做它“需要做的”,但我觉得这是一个糟糕的捷径。我的意思是我们拥有所有这些 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 与使用它来调用方法然后正确地失败/忽略“不是消息”之间似乎存在差异。正确的?