hasattr用于嵌套属性

时间:2014-07-16 11:21:05

标签: python

我需要这样的东西(伪代码):

if hasattr(object, 'detail.infotext')

我的意思是我想检查对象是否具有属性details,如果有,则details是否具有名为infotext的属性

我可以这样做:

if hasattr(object, 'detail'):
    if hasattr(object.detail, 'infotext'):
        do something

但是单行阅读更容易阅读。

5 个答案:

答案 0 :(得分:2)

我知道这并不是你想要做的事情,但无论如何它都是pythonic(如果你知道你明确寻找的属性的名称):

try:
   do something with object.detail.infotext
except AttributeError:
   do something else

答案 1 :(得分:1)

假设您想要实际使用属性值,operator.attrgetter(在Python 2.6+中)也可能有用。你还需要捕捉异常,除此之外它很简单:

from operator import attrgetter

try:
   print attrgetter("detail.infotext")(object)
except:
   <handle exception>

答案 2 :(得分:0)

我曾经在我的项目中使用类似的东西;

attr = 'detail.infotext'.split('.')
if len(attr) == 1:
    return getattr(item, attr[0], "")
else:
    return getattr(getattr(item, attr[0], ""), attr[1], "")

或者,只是一个班轮声明;

    attr = "detail.infotext"
    if hasattr(item, attr.rsplit('.', 1)[0]) and hasattr(getattr(item, attr.rsplit('.', 1)[0]), attr.rsplit('.', 1)[1]):
        pass

答案 3 :(得分:0)

老问题,但这里有另一种建立在 this 答案基础上的方法,它为嵌套的 getattr... 提供了一个很好的解决方案

import functools

def rhasattr(obj, path):
    try:
        functools.reduce(getattr, path.split("."), obj)
        return True
    except AttributeError:
        return False

答案 4 :(得分:-1)

未经测试但应该有效:

def hasattrpath(obj, path):
    parts = path.split(".")
    for part in parts:
        if hasattr(obj, part):
            obj = getattr(obj, part)
        else:
            return False
    else:
        return True

但除非你的代码库中到处都有这种类型的测试,并且有深层嵌套的路径表达式,否则jonrsharpe的评论可能是最直接的解决方案。