我有一个对象myobject
,它可能返回None
。如果返回None
,则不会返回属性id
:
a = myobject.id
因此,当肌对象是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
,但如果对象myobject
中没有属性id
,那么就返回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
(宇宙)开始,然后递归地为您尝试使用getattr
访问的每个属性深入,所以在您的问题中,它会是这样的:
a = getattr(getattr(myobject, 'id', None), 'number', None)
最简单的方法是使用三元运算符:
a = myobject.id if myobject is not None else None
如果中间值为true,则三元运算符返回第一个表达式,否则返回后一个表达式。
请注意,您也可以使用另一种方式,使用异常:
try:
a = myobject.id
except AttributeError:
a = None
这符合Python的理想,即请求原谅比允许更容易——什么是最好的取决于情况。
在我的对象类中,您可以放置覆盖
class Foo(object):
def __getattribute__(self, name):
if not name in self;
return None;
else:
# Default behaviour
return object.__getattribute__(self, name)
如果您想解决myobject
类定义中的问题(如Black Diamond的答案),您可以简单地定义__getattr__
以返回None
:
class Myobject:
def __getattr__(self, name):
return None
这是因为__getattr__
仅在尝试访问不存在的属性时被调用,而无论属性的名称如何,__getattribute__
总是首先被调用。(另请参阅此SO帖子。)
试用:
myobject = Myobject()
print myobject.id
myobject.id = 7
print myobject.id
关于模块内置函数getattr的帮助:
getattr(...) getattr(object, name[, default]) -> value
从对象中获取命名属性;getattr(x,'y')等价于x.y。当给定默认参数时,当属性没有存在如果没有它,则在这种情况下会引发异常。
以下内容应该有效:
a = getattr(myobject, 'id', None)
try:
a = myobject.id
except AttributeError:
a = None
IMO 也将工作并且更清晰
a=myobect.id if myobject else None