在Python中hasattr可以查找多层子属性吗?
如果我有 node.child1.child2
,我能否有效地使用 hasattr(node, 'child1.child2')
呢?如果没有 child1
,会出错吗,还是说只是返回 false?
2 个回答
5
这里有一种方法可以实现:
def hasattrdeep(obj, *names):
for name in names:
if not hasattr(obj, name):
return False
obj = getattr(obj, name)
return True
你可以这样调用它:
hasattrdeep(node) is True # A side-effect. Could be made invalid if really desired by raising TypeError if len(names) == 0
hasattrdeep(node, 'foo') is False
hasattrdeep(node, 'child1') is True
hasattrdeep(node, 'child1', 'foo') is False
hasattrdeep(node, 'child1', 'child2') is True
8
hasattr
这个函数不能像那样使用点号(.)来查找属性的层级关系。不过,你可以自己写一个函数来实现这个功能:
def get_deep_attr(obj, attrs):
for attr in attrs.split("."):
obj = getattr(obj, attr)
return obj
def has_deep_attr(obj, attrs):
try:
get_deep_attr(obj, attrs)
return True
except AttributeError:
return False