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