是否有一种Pythonic方法来处理可能不包含任何对象链的对象链?

是否有一种Pythonic方法来处理可能不包含任何对象链的对象链?,python,django,Python,Django,我的Django代码库有一些外键引用,这些外键引用有一些对象很深,在每一个级别上检查真实性感觉就像是一种代码味道 有没有一种方法可以用更少的样板来检查这种东西 以这个简化的例子为例: if page.banner.image: # ... 如果page.banner是可选的,并且它不存在,它将返回None并抛出异常,正确地说,NoneType没有image属性 显而易见的解决办法是 if page.banner and page.banner.image: # ... 但这会

我的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):
    # ...
有没有一种简洁的方法可以在没有所有这些条件子句的情况下做到这一点?

Python推荐这种方法

try:
    new_var = page.banner.image
except AttributeError:
    ....
关于请求许可与宽恕,有一些很好的讨论。

Python推荐这种方法

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

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

是的,这是有道理的。使用一堆
try.。除了
块之外,感觉有点奇怪。是的,我需要更加牢记这一点。谢谢是的,这很有道理。使用一堆
try.。除了
块之外,感觉有点奇怪。是的,我需要更加牢记这一点。谢谢