在Python中hasattr可以查找多层子属性吗?

2 投票
2 回答
1628 浏览
提问于 2025-04-16 07:58

如果我有 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

撰写回答