是否有Pythonic方法来处理可能包含None的对象链?

时间:2017-12-14 23:30:48

标签: python django

我的Django代码库有外键引用,它们是一些深层对象,感觉就像代码气味,需要检查每个级别的真实性。

有没有办法用更少的样板来检查这种东西?

采用这个简化的例子:

if page.banner.image:
    # ...

如果page.banner是可选的且不存在,则会返回None并抛出异常,说明NoneType没有image属性

明显的解决方法是

if page.banner and page.banner.image:
    # ...

但这会变得重复和冗长。我想你可以用getattr()来做我喜欢的事情,但它更加丑陋:

if getattr(getattr(page, 'banner', None), 'image', None):
    # ...

如果没有所有这些条件条款,是否有一种简洁的方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

Python推荐使用easier to ask for forgiveness than permission方法。

try:
    new_var = page.banner.image
except AttributeError:
    ....

关于请求许可与宽恕here有一些很好的讨论。