1

pinax Userdict.py:

def __getitem__(self, key):
        if key in self.data:
            return self.data[key]
        if hasattr(self.__class__, "__missing__"):
            return self.__class__.__missing__(self, key)

なぜこれを行うのですかself.__class__.__missing__

ありがとう

4

2 に答える 2

6

ここに示されているUserDict.pyは、組み込みを厳密にエミュレートしますdict。たとえば、次のようになります。

>>> class m(dict):
...   def __missing__(self, key): return key + key
... 
>>> a=m()
>>> a['ciao']
'ciaociao'

__missing__ビルトインをサブクラス化するときに欠落しているキーを処理するための特別なメソッドをオーバーライドできるのと同じようにdict、それをサブクラス化するときにオーバーライドできますUserDict

dictの公式Pythonドキュメントはここにあり、彼らはこう言っています:

バージョン2.5の新機能:dictのサブクラスがメソッド__missing__()を定義している場合、キーキーが存在しない場合、 d[key]操作はキーキーを引数としてそのメソッドを呼び出します。次に 、キーが存在しない場合、d[key]操作は、呼び出しによって返された、または発生したものをすべて返したり、発生させたりします。__missing__(key)他の操作やメソッドはを呼び出しません __missing__()__missing__()定義されていない場合、KeyErrorが発生します。 __missing__()メソッドである必要があります。インスタンス変数にすることはできません。例については、を参照してくださいcollections.defaultdict

于 2010-01-02T00:41:07.630 に答える
0

dict(別名__missing__ )でデフォルト値を使用する場合はdefaultdict、コレクションモジュールからチェックアウトできます。

from collections import defaultdict

a = defaultdict(int)

a[1] # -> 0
a[2] += 1
a # -> defaultdict(int, {1: 0, 2: 1})
于 2017-03-01T03:50:50.557 に答える