割り当てには Python の戻り値がなく、の戻り値__setitem__()
は無視されます。通常、代わりに例外を発生させます。
class Only5Items(dict):
def __setitem__(self, key, value):
if len(self) < 5 or key in self: # allow reassignment of existing key
return super(Only5Items, self).__setitem__(key, value)
raise KeyError("maximum number of items (5) exceeded")
次に、クライアント コードで例外をキャッチできます。
items = Only5Items(hi1="asdf1", hi2="asdf2", hi3="asdf3", hi4="asdf4", hi5="asdf5")
try:
items["hi6"] = "asdf6"
except KeyError as e:
print(e)
戻りたい場合は、値を返すことができるTrue/False
独自の割り当てメソッドを作成する必要があります。
class Only5Items(dict):
def __setitem__(self, key, value):
if len(self) < 5 or key in self: # allow reassignment of existing key
return super(Only5Items, self).__setitem__(key, value)
raise KeyError("maximum number of items (5) exceeded")
def did_set(self, key, value):
try:
self[key] = value
except KeyError:
return False
return True
次に、次のように使用します。
if not items.did_set("hi6", "asdf6"):
print "couldn't set key 'hi6', dictionary is probably full"
おそらく、アイテムの数も確認するためにオーバーライドsetdefault()
したいでしょう...また、クラスをインスタンス化するときに、5にハードコーディングするのではなく、最大数を渡すといいでしょう(そして非常に簡単です)。