3

私は次の辞書を持っています:

class Only5Items(dict):
    def __setitem__(self, key, value):
        if len(self) < 5:
            super(Only5Items, self).__setitem__(key, value)

アイテムの追加に成功したら、true を返したいです。何か案は?

もう少し説明します。例えば:

items = Only5Items()
items["hi1"] = "asdf1"
items["hi2"] = "asdf2"
items["hi3"] = "asdf3"
items["hi4"] = "asdf4"
items["hi5"] = "asdf5"
items["hi6"] = "asdf6"

items["hi6"] = "asdf6"挿入しません。そして、それについてのメッセージを印刷したいと思います。

編集: len(self) が機能します。より具体的には、それに関するメッセージを出力したくありません。追加に成功した場合は true/false を返したいです。クラス外の何か。

4

3 に答える 3

4

割り当てには 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にハードコーディングするのではなく、最大数を渡すといいでしょう(そして非常に簡単です)。

于 2013-10-30T15:41:54.913 に答える
2

ええと、私は次のことをするだけです:

class Only5Items(dict):
    def __setitem__(self, key, value):
        if len(self) < 5:
            return super(Only5Items, self).__setitem__(key, value)
        else:
            raise KeyError("You forgot I can only have 5 items dummy!")

    def __str__(self):
        return super(Only5Items, self).__str__()

次のスクリプト:

d = Only5Items(a=1, b=2, c=3, d=4, e=5)
print d

try:
    d['making a mistake'] = 'hahahahah'
except KeyError, e:
    print e

プロデュース:

{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
'You forgot I can only have 5 items dummy!'
于 2013-10-30T15:42:55.213 に答える
1
class Only5Items(dict):
    def __setitem__(self, key, value):
        if len(self) < 5:
            super(Only5Items, self).__setitem__(key, value)
            print "Succesfully inserted!"
        else:
            print "Dictionary full!" 
于 2013-10-30T15:33:06.560 に答える