如何返回属性的默认值



我有一个对象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

相关内容

  • 没有找到相关文章