如何返回属性的默认值?
问题描述
我有一个对象 myobject
,它可能返回 None
.如果返回None
,则不会返回属性id
:
I have an object myobject
, which might return None
. If it returns None
, it won't return an attribute id
:
a = myobject.id
所以当 myobject 为 None
时,上面的语句会导致 AttributeError
:
So when myobject is None
, the stament above results in a AttributeError
:
AttributeError: 'NoneType' object has no attribute 'id'
如果 myobject
为 None,那么我希望 a
等于 None
.如何在一行语句中避免此异常,例如:
If myobject
is None, then I want a
to be equal to None
. How do I avoid this exception in one line statement, such as:
a = default(myobject.id, None)
解决方案
你应该使用 getattr
包装器,而不是直接检索 id
的值.
a = getattr(myobject, 'id', None)
这就像说我想从对象myobject
中检索属性id
,但是如果里面没有属性id
对象 myobject
,然后返回 None
."但它确实有效.
This is like saying "I would like to retrieve the attribute id
from the object myobject
, but if there is no attribute id
inside the object myobject
, then return None
instead." But it does it efficiently.
有些对象还支持以下形式的getattr
访问:
Some objects also support the following form of getattr
access:
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
访问的每个属性递归地深入,所以在您的问题中它会是像这样:
Reduce is like an in-place recursive function. What it does in this case is start with the obj
(universe) and then recursively get deeper for each attribute you try to access using getattr
, so in your question it would be like this:
a = getattr(getattr(myobject, 'id', None), 'number', None)
相关文章