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