Python 用于嵌套属性的hasattr

Python 用于嵌套属性的hasattr,python,Python,我需要这样的东西(伪代码): 我的意思是我想检查对象是否有属性details,如果有,那么如果details有一个名为infotext 我可以这样做: if hasattr(object, 'detail'): if hasattr(object.detail, 'infotext'): do something 但是一行程序更容易阅读。未经测试,但它应该可以工作: def hasattrpath(obj, path): parts = path.split("

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

我的意思是我想检查对象是否有属性
details
,如果有,那么如果
details
有一个名为
infotext

我可以这样做:

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

但是一行程序更容易阅读。

未经测试,但它应该可以工作:

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的注释可能是最简单的解决方案。

我知道这并不是您真正想要做的,但它更像Python(如果您明确知道要查找的属性的名称):


假设您希望实际使用属性值,
operator.attrgetter
(在Python 2.6+中)也可能很有用。您仍然需要捕获一个异常,除此之外,它非常简单:

from operator import attrgetter

try:
   print attrgetter("detail.infotext")(object)
except:
   <handle exception>
从操作员导入属性
尝试:
打印属性(“detail.infotext”)(对象)
除:

在我的项目中,我曾经做过类似的事情

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

旧问题,但这里有另一种基于答案的方法,它为嵌套的
getattr
提供了一个很好的解决方案

导入工具
def rhasattr(对象,路径):
尝试:
functools.reduce(getattr,path.split(“.”),obj)
返回真值
除属性错误外:
返回错误
如果hasattr(object,'detail')和hasattr(object.detail,'infotext'):
?延迟求值意味着只有在第一个值为True时,才会调用第二个值
hasattr
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