只捕获本地AttributeError(检查方法是否存在并调用它时)

问题描述:

什么是仅在缺少方法时捕获AttributeError的最“pythonic”方法,而不是在后续调用该方法内的代码中使用AttributeError?我有这样的代码,它试图调用的方法,并在缺少方法或一些预期异常的情况下,提供一些操作:只捕获本地AttributeError(检查方法是否存在并调用它时)

def foo(unknown_object): 
    try: 
     unknown_object.do_something() 
    except SomeSpecificError: 
     # the method existed, but failed in some expected way 
    except AttributeError: 
     # do something else ... 

这个也有运行do_something()AttributeError,例如编程错误的问题(拼写某些属性错误)。这对于调试显然不是很好,并且捕获太多可能本身就是一个错误。我可以把它改写成:

def foo(unknown_object): 
    try: 
     method=unknown_object.do_something 
    except AttributeError: 
     # do something else ... 
    else: 
     try: 
      method() 
     except SomeSpecificError: 
      # the method existed, but failed in some expected way 

但是这是嵌套的解决方案,避免赶上太多AttributeError的最Python的方式?

注意:该方法是丢失或赎回(或者它是一个编程错误,应提高捕获的异常),所以我不需要检查呼叫的能力。

如果你真要查的东西,具体的,那么你可以使用hasattr和可调用的方法

if hasattr(unknown_object, "do_something") and callable(unknown_object.do_something): 
    unknown_object.do_something() 
+0

是的,这就是我现在正在做什么。或者(使用普通符号而不是hasattr所需的字符串)try:foo.attr,除了AttributeError:pass else:foo.attr()。但它似乎仍然是浪费的重复。 – pereric