Python中的Swift Optionals(或Haskell's Maybe)?

时间:2015-12-30 23:59:22

标签: python swift haskell optional maybe

在Swift中,我可以var?.prop。如果nilvar,则结果为nil,否则会产生prop var属性的值。

同样地,我可以在Haskell中执行var >>= propNone var Noneprop,否则它会给我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中是否有等价物?

3 个答案:

答案 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”进行尝试。我欢迎评论,功能要求和贡献。