我知道这是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
答案 0 :(得分:2)
如果您希望post_code
为None
,请通过尝试访问不存在的项来捕获引发的异常:
try:
post_code = department.parent_department.get('sibling').employees.get('John').address.post_code
except (AttributeError, KeyError):
post_code = None
答案 1 :(得分:0)
实际上,一个有效的答案是开始用Monads(可能是monad)来思考这些函数的链接。一个非常原始的教程是https://github.com/dustingetz/dustingetz.github.com/blob/master/_posts/2012-04-07-dustins-awesome-monad-tutorial-for-humans-in-python.md