【发布时间】:2016-09-15 23:34:14
【问题描述】:
鉴于以下类(具有错误属性),那么检查 bar 属性是否存在的最佳万无一失的方法是什么?
class Foo(object):
@property
def bar(self):
raise AttributeError('unforeseen attribute error!')
hasattr 和 getattr 都失败了,只有 dir 有效:
foo = Foo()
print hasattr(foo, 'bar')
# False
try:
getattr(foo, 'bar')
print True
except AttributeError as e:
print False
# False
print 'bar' in dir(foo)
# True
我能想到的最好的全方位解决方案是:
def robust_hasattr(obj, attr):
return hasattr(obj, attr) or attr in dir(obj)
有没有更好的办法?
【问题讨论】:
-
为什么需要检查?假设它在那里,如果不存在则处理错误;
try和except如果你能从中恢复,或者如果你不能让它传播。 -
嗯,你的财产确实提高了
AttributeError。它坚定地试图表明该属性不存在。您必须检测到这是一个属性的具体用例是什么? -
实际用例更复杂——我正在继承一个与硬件对话的类,并且可能有意外的错误(包括属性错误)。在子类中,我只想检查属性名称是否存在(出于接口原因),而不是必须执行它们。
hasattr的问题在于它通过在潜在复杂的父类中隐藏任何错误(不仅仅是AttributeError)而“失败”,这使得调试实际错误变得困难。
标签: python properties attributes getattr hasattr