2015-12-30 6 views
8

スウィフトではvar?.propができます。 varnilの場合はnilになり、それ以外の場合はpropプロパティの値がvarになります。Swiftオプション(またはHaskell's Maybe)をPythonで使用していますか?

等価的に、私はNoneは、それは私に(Justに包まれた)var内部値にpropを適用する値を与える他に、varNoneである私に与えた、Haskellでvar >>= propを行うことができます。

Pythonには同等の機能はありますか?あなたが機能を模倣するために、条件付き代入(三項演算子)を使用することができますが

+1

混乱するタイトルとタグ。 – Snusmumrikken

+0

条件式を使用することができます: 'var.prop if var else var'ですが、一般的にPythonでは何かがNoneであるときと、そうでないときと何度も何度も尋ねないと予想されます。 –

+5

@Snusmumrikkenそれほど実際にはわかりませんが、スウィフトやハスケルのコンセプトを理解して理解する必要があるだけです。 – Zizouz212

答えて

3

その他の回答は、条件式を示唆するうえで正解ですが、それを行う方法については間違っています。 Pythonのこのような機能を追加する方法についてdraft PEPがあり、等価

None if var is None else var.prop 

または、

var.prop if var is not None else None 

、及びTHERは、メーリングリストのPython-アイデアにそれについての議論されています:あなたは、このようにそれを行うことができます。近い将来追加されるようには見えませんが、PEPを読むと、これを扱う既存の提案方法が提案されます。

+0

"その他の答えは、条件式を示唆するのは正しい軌道にありますが、それを行う方法については間違っています。このようにすることができます" - 私のanawerはあなたのものと同じならどうなりますか? –

+0

@EliKorvigo:私がこれを書いて始めたときのあなたの答えは間違っていましたが、あなたはそれを編集しました。 – BrenBarn

2

かいつまんで、optionalsを処理するための特別な構文は、(何のoptionalsがないため)が存在しない:

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 

問題がここにbool(var.prop) == Falseの場合はNoneになりますので、上記の三項演算子を使用することをお勧めします。

+1

まあまあではありません。 'var'が時々' prop'と 'None'を持つオブジェクトである場合、それは暗黙のオプションとまったく同じです。このビューのPythonの 'var.prop'は、Swiftの' var!.prop'に似ています: 'var'が' None'の場合にスローされます。次に、 'var'は' prop'のない他のオブジェクトでもあります:Swiftはこれを「プロトコルを実装していません」と呼びます。したがって、より正確な変換は '(var!as!havingProp).prop'のようなものです。そして主な違いは、スウィフトはこの種の各仮定を感嘆符で明示しているということだけです。 –

+7

"Pythonの力学的な型付けによって、それは簡単になります" - なぜなら、インラインの条件式は '。 – Ryan

+1

IMO、あなたは意見のビットを削除する必要があります - これは "奇妙な"言語構成と "些細な"ものを議論する場所ではありません。そうでなければ、これは良い答えです - 私はあなたが様々なオプションを探検するのが好きです。 (しかし、本当に短い答えは: "いいえ、そのような構文はありません") – skagedal

関連する問題