我需要这样的东西(伪代码):
if hasattr(object, 'detail.infotext')
我的意思是我想检查对象是否具有属性details
,如果有,则details
是否具有名为infotext
的属性
我可以这样做:
if hasattr(object, 'detail'):
if hasattr(object.detail, 'infotext'):
do something
但是单行阅读更容易阅读。
答案 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的评论可能是最直接的解决方案。