python - 如何返回属性的默认值?

标签 python reflection attributes default void

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

相关文章:

python - Tensorflow 可以混洗多个分片 TFrecord 二进制文件以进行对象检测训练吗?

python - 使用py2exe时出现名称错误

java - 使用反射从 XML 文件(Java 中)读取数据

php - Laravel 获取模型属性 : difference between two methods

class - UML 类图

Python 字符串、列表和元组的行为不同

python - Nose 、unittest.TestCase 和元类 : auto-generated test_* methods not discovered

java - OneToMany 关系中的 Hibernate/反射问题 : IllegalArgumentException

java - 无法使用 Mockito 或 PowerMockito 的反射对 Java 代码进行单元测试

javascript - 您可以通过命名标题属性更改链接标题吗?