404

C# には、代入中に簡単な (短い) null チェックを可能にするnull 合体演算子( として記述) があります。??

string s = null;
var other = s ?? "some default value";

pythonに相当するものはありますか?

私はできることを知っています:

s = None
other = s if s else "some default value"

しかし、さらに短い方法はありますか (ここで繰り返す必要はありませんs)。

4

11 に答える 11

557
other = s or "some default value"

orわかりました、オペレーターがどのように機能するかを明確にする必要があります。これはブール演算子であるため、ブール コンテキストで機能します。値がブール値でない場合、演算子のためにブール値に変換されます。

演算子はororのみを返すわけではないことに注意してください。代わりに、最初のオペランドが true と評価された場合は最初のオペランドを返し、最初のオペランドが false と評価された場合は 2 番目のオペランドを返します。TrueFalse

この場合、式は、ブール値に変換されたときに true または true に評価された場合にx or y返されます。それ以外の場合は、 を返します。ほとんどの場合、これは C♯ の null 合体演算子とまったく同じ目的で機能しますが、次の点に注意してください。xTruey

42    or "something"    # returns 42
0     or "something"    # returns "something"
None  or "something"    # returns "something"
False or "something"    # returns "something"
""    or "something"    # returns "something"

変数sを使用して、クラスのインスタンスへの参照または(クラスがメンバーand をNone定義していない限り) を保持する場合、null 合体演算子と同じセマンティクスを使用しても安全です。__nonzero__()__len__()

実際、Python のこのような副作用があると便利な場合さえあります。どの値が false と評価されるかはわかっているので、これを使用して、None具体的に (エラー オブジェクトなど) を使用せずにデフォルト値をトリガーできます。

一部の言語では、この動作はElvis 演算子と呼ばれます。

于 2011-02-12T15:06:31.923 に答える
97

厳密には、

other = s if s is not None else "default value"

そうしないs = False"default value"、意図したものではない可能性があります。

これを短くしたい場合は、次を試してください。

def notNone(s,d):
    if s is None:
        return d
    else:
        return s

other = notNone(s, "default value")
于 2011-02-12T15:52:48.090 に答える
51

ではない最初の引数を返す関数は次のNoneとおりです。

def coalesce(*arg):
  return reduce(lambda x, y: x if x is not None else y, arg)

# Prints "banana"
print coalesce(None, "banana", "phone", None)

reduce()最初の引数が でなくても、すべての引数を不必要に反復する可能性があるNoneため、このバージョンを使用することもできます。

def coalesce(*arg):
  for el in arg:
    if el is not None:
      return el
  return None
于 2013-04-27T00:45:21.267 に答える
4

単一の値に対する@Bothwellsの回答(私が好む)に加えて、関数の戻り値の割り当てをnullチェックするために、新しいwalrus-operatorを使用できます(python3.8以降):

def test():
    return

a = 2 if (x:= test()) is None else x

したがって、test関数を 2 回評価する必要はありません (のようにa = 2 if test() is None else test()) 。

于 2020-03-02T13:03:27.537 に答える