を使用して python 辞書を更新する背後にある正確なメカニズムを理解しようとしていd[key] += diff
ます。マジック メソッドの呼び出しをトレースするためのヘルパー クラスがいくつかあります。
class sdict(dict):
def __setitem__(self, *args, **kargs):
print "sdict.__setitem__"
return super(sdict, self).__setitem__(*args, **kargs)
def __delitem__(self, *args, **kargs):
print "sdict.__delitem__"
return super(sdict, self).__delitem__(*args, **kargs)
def __getitem__(self, *args, **kargs):
print "sdict.__getitem__"
return super(sdict, self).__getitem__(*args, **kargs)
def __iadd__(self, *args, **kargs):
print "sdict.__iadd__"
return super(sdict, self).__iadd__(*args, **kargs)
def __add__(self, *args, **kargs):
print "sdict.__add__"
return super(sdict, self).__add__(*args, **kargs)
class mutable(object):
def __init__(self, val=0):
self.value = val
def __iadd__(self, val):
print "mutable.__iadd__"
self.value = self.value + val
return self
def __add__(self, val):
print "mutable.__add__"
return mutable(self.value + val)
これらのツールを使用して、ダイビングに行きましょう。
>>> d = sdict()
>>> d["a"] = 0
sdict.__setitem__
>>> d["a"] += 1
sdict.__getitem__
sdict.__setitem__
>>> d["a"]
sdict.__getitem__
1
__iadd__
左側の式がメソッドd["a"]
を実装しない整数を返すため、ここでは操作が呼び出されていません__iadd__
。Python が魔法のように+=
演算子を__getitem__
and__setitem__
呼び出しに変換しているのを確認できます。
続き:
>>> d["m"] = mutable()
sdict.__setitem__
>>> d["m"] += 1
sdict.__getitem__
mutable.__iadd__
sdict.__setitem__
>>> d["m"]
sdict.__getitem__
<__main__.mutable object at 0x106c4b710>
ここで、+=
オペレーターはメソッドを正常に呼び出します__iadd__
。+=
演算子が実際に 2 回使用されているようです。
- への魔法の翻訳のための 1 回
__getitem__
と__setitem__
呼び出し - 2回目の
__iadd__
電話です。
助けが必要な場所は次のとおりです。
+=
演算子を__getitem__
and__setitem__
呼び出しに変換するための正確な技術的メカニズムは何ですか?- 2 番目の例で、
+=
演算子が 2 回使用されているのはなぜですか? Python はステートメントを次のように変換しませんかd["m"] = d["m"] + 1
(その場合__add__
、代わりに呼び出されることはありませ__iadd__
んか?)