我有一个对象 myobject
,它可能返回 None
。如果返回None
,则不会返回属性id
:
a = myobject.id
所以当 myobject 为 None
时,上面的语句会导致 AttributeError
:
AttributeError: 'NoneType' object has no attribute 'id'
如果 myobject
为 None,那么我希望 a
等于 None
。如何在一行语句中避免此异常,例如:
a = default(myobject.id, None)
最佳答案
您应该使用 getattr
包装器而不是直接检索 id
的值。
a = getattr(myobject, 'id', None)
这就像说“我想从对象myobject
中检索属性id
,但是如果里面没有属性id
对象 myobject
,然后返回 None
。"但它确实有效。
有些对象还支持以下形式的getattr
访问:
a = myobject.getattr('id', None)
根据 OP 请求,'deep getattr' :
def deepgetattr(obj, attr):
"""Recurses through an attribute chain to get the ultimate value."""
return reduce(getattr, attr.split('.'), obj)
# usage:
print deepgetattr(universe, 'galaxy.solarsystem.planet.name')
简单解释:
Reduce就像一个就地递归函数。在这种情况下,它的作用是从 obj
(universe)开始,然后为您尝试使用 getattr
访问的每个属性递归地深入,所以在您的问题中它会是像这样:
a = getattr(getattr(myobject, 'id', None), 'number', None)
关于python - 如何返回属性的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923465/