在Swift中,我可以var?.prop
。如果nil
为var
,则结果为nil
,否则会产生prop
var
属性的值。
同样地,我可以在Haskell中执行var >>= prop
,None
var
None
是prop
,否则它会给我var
的价值到Just
内的值(包含在Array ( [0] => Array ( [0] => Array ( [related-headline] => Street Outlaws Turbo Rotary Mazda RX-7 – OKC NoPrep [related-url] => //localhost:3000/street-outlaws-turbo-rotary-mazda-rx-7-okc-noprep/ [related-image_id] => 78055 [related-image] => //localhost:3000/wp-content/uploads/2015/12/lucky-to-be-alive-distracted-dri.jpg ) [1] => Array ( [related-headline] => In the Driver’s Seat: Shane vs. The Reaper | Street Outlaws [related-url] => //localhost:3000/in-the-drivers-seat-shane-vs-the-reaper-street-outlaws/ [related-image_id] => 78048 [related-image] => //localhost:3000/wp-content/uploads/2015/12/ford-f350-vs-dodge-ram-vs-chevy.jpg ) ) )
中)。
Python中是否有等价物?
答案 0 :(得分:5)
其他答案在建议条件表达式的正确轨道上,但在如何做到这一点上是错误的。你可以这样做:
None if var is None else var.prop
或等同于
var.prop if var is not None else None
有一个draft PEP关于向Python添加这样的功能,并且已经在Python-ideas邮件列表上讨论了它。它似乎不会在不久的将来添加(如果有的话),但阅读PEP将让您了解一些现有的和提议的处理方法。
答案 1 :(得分:2)
长话短说,没有特殊的语法来处理选项(因为没有选项),尽管你可以使用条件赋值(三元运算符)来模仿功能:
unpacked_var = var.prop if var is not None else None
虽然在Python中我宁愿检查var
是否具有您想要访问的属性。
unpacked_var = var.prop if hasattr(var, "prop") else None
您可以编写一个功能以缩短
def optional(var, attr):
return getattr(var, attr) if hasattr(var, attr) else None
unpacked_var = optional(var, "prop")
有一种不那么普遍的方法可以做到这一点(并且不太明确,恕我直言):
unpacked_var = hasattr(var, "prop") and var.prop or None
这里的问题是,如果None
,您将获得bool(var.prop) == False
,因此您最好坚持上面的三元运营商。
答案 2 :(得分:0)
使用None
对于维护干净的呼叫站点代码可能很棘手。这意味着您需要具有很多防御条件。从其他答案中可以看出,聪明人对此方法有很多支持。
一种替代方法是使用可选类型,该类型很像集合类型(列表,集合,字典等)显式为空或不为空,但是与其他集合类型不同,它只能持有1个元素。这意味着您从函数返回的所有内容都将返回具有相同功能的对象。就像返回集合的东西一样,当出现问题但并非异常时,您可以返回该集合的空版本(例如,数据库中没有用户年龄超过100),您可以使用可选类型来执行相同操作(例如,数据库中没有用户名为foobar的用户)。
由于python没有内置的可选类型,因此我创建了一个小型库来提供它:optional.py。您可以使用“ pip install optional.py”进行尝试。我欢迎评论,功能要求和贡献。