3

重複の可能性:
python - デフォルト値を返す

クラスに関数があります:

def foo(self, value = None):
    if value is None:
        return self.value
    self.value = value
    return self

これは getter と setter を 1 つにまとめたもので、次のように関数を連鎖できるという利点があります。

three = anInstanceOfMyClass.foo(3).bar().foo()

次のようにすると問題が発生します。

shouldBeNoneButIsThree = anInstanceOfMyClass.foo(3).foo(None).foo()

ここで foo は、引数を渡さなかったと考えています。次の方法でこれを回避できます。

  1. ランダムな文字列のような奇妙なオブジェクトに値を設定する
  2. 値がデフォルト値として持つコンストラクターでオブジェクトインスタンスを作成します

どちらも少し手間がかかりすぎるように思えます。より簡単な方法は何ですか?

値を何かに設定する

4

2 に答える 2

7

デフォルト値が設定されていないことを検出するには、センチネルを使用する必要があります。

sentinel = object()

def foo(self, value=sentinel):
    if value is not sentinel:
        print("You passed in something else!")

のインスタンスobject()は常に独自のメモリ ID を持ちis、正確な値がそのまま残っている場合にのみ True を返すため、これは機能します。など、他の値は同じオブジェクトとして登録されませんNone

上記のトリックのさまざまなバリエーションが、さまざまな python プロジェクトで見られます。次のセンチネルも機能します。

sentinel = []
sentinel = {}
于 2012-11-08T11:13:04.470 に答える
2

センチネル オブジェクト値の使用はかなり一般的です。これはライブラリが行うことですabcoll.py

   __marker = object()

   def pop(self, key, default=__marker):
       ...
       if default is self.__marker:

センチネル オブジェクトは、クラスで直接定義する必要があることに注意してください。

于 2012-11-08T11:14:45.787 に答える