0

我知道这是在 Java 8 或 9 的管道中,但我认为必须有一种方法可以在 python 中做到这一点。例如,我正在编写一个复杂的表达式,并且懒得在所有级别添加空检查(下面的示例)

post_code = department.parent_department.get('sibling').employees.get('John').address.post_code

我不想担心几个中间值是“无”。例如,如果 parent_department 没有兄弟键,我想分流并返回 None 分配给 post_code。就像是

post_code = department?.parent_department?.get('sibling')?.employees?.get('John')?.address?.post_code

这可以在 Python 2.7.1 中完成吗?我知道这意味着调试时会遇到更多麻烦,但假设我已经完成了所有预检查,如果任何值为 null 则表示内部错误,所以如果我只是得到特定行失败的错误跟踪就足够了。

这是一种更详细的方式。我只需要一个不会抛出随机异常的单行器

def get_post_code(department):
    if department is None:
        return None
    if department.parent_department is None:
        return None
    if department.parent_department.get('sibling') is None:
        return None
    ... more checks...
    return post_code = department.parent_department.get('sibling').employees.get('John').address.post_code
4

2 回答 2

2

如果您想post_code成为None然后捕获通过尝试访问不存在的项目引发的异常:

try:
    post_code = department.parent_department.get('sibling').employees.get('John').address.post_code
except (AttributeError, KeyError):
    post_code = None
于 2013-03-14T14:02:47.143 回答
0

实际上,对此的一个有效答案是开始考虑单子(可能是单子)来链接这些函数。一个非常原始的教程位于https://github.com/dustingetz/dustingetz.github.com/blob/master/_posts/2012-04-07-dustins-awesome-monad-tutorial-for-humans-in-python。 MD

于 2013-03-19T10:30:22.337 回答