15

さて、質問はタイトルにあります:不変のキーと可変の値を持つPython辞書を定義するにはどうすればよいですか? 私はこれを思いつきました(python 2.xで):

class FixedDict(dict):
    """
    A dictionary with a fixed set of keys
    """

    def __init__(self, dictionary):
        dict.__init__(self)
        for key in dictionary.keys():
            dict.__setitem__(self, key, dictionary[key])

    def __setitem__(self, key, item):
        if key not in self:
            raise KeyError("The key '" +key+"' is not defined")
        dict.__setitem__(self, key, item)

しかし、私には(当然のことながら)かなりずさんに見えます。特に、これは安全ですか、それとも dict から継承しているため、実際にいくつかのキーを変更/追加するリスクはありますか? ありがとう。

4

3 に答える 3

15

dictサブクラス化する代わりにプロキシ化を検討してください。つまり、dictの実装にフォールバックするのではなく、定義したメソッドのみが許可されます。

class FixedDict(object):
        def __init__(self, dictionary):
            self._dictionary = dictionary
        def __setitem__(self, key, item):
                if key not in self._dictionary:
                    raise KeyError("The key {} is not defined.".format(key))
                self._dictionary[key] = item
        def __getitem__(self, key):
            return self._dictionary[key]

また、エラー メッセージを生成する代わりに、文字列の書式設定を使用する必要があり+ます。そうしないと、文字列以外の値に対してクラッシュするためです。

于 2013-02-11T16:31:19.173 に答える
1

誰かが新しいキーを追加できないようにする方法は、誰かが新しいキーを追加しようとする理由に完全に依存します。コメントにあるように、キーを変更するほとんどの辞書メソッドは を通過しない__setitem__ため、.update()呼び出しによって新しいキーが問題なく追加されます。

誰かが を使用することだけを期待している場合はd[new_key] = v__setitem__問題ありません。キーを追加するために他の方法を使用する可能性がある場合は、さらに作業を行う必要があります。そしてもちろん、彼らはいつでもこれを使ってそれを行うことができます:

dict.__setitem__(d, new_key, v)

Python では、物事を真に不変にすることはできません。特定の変更を停止することしかできません。

于 2013-02-11T16:38:11.827 に答える