3

キーとオブジェクトのペアで満たされた辞書があります。辞書を不変にしたいのですが、最良/最も簡単な方法はそれをfrozensetにキャストすることですが、キーのみを保存することfrozenset(dict)も考えました。tuple(dict)

を使用frozenset(dict.items())すると、キーとオブジェクトのペアでフリーズセットを取得しているように見えますが、値/キーを取得する方法がわかりません。

「__obfuscators」が辞書である限り、次のコードが機能します

def obfuscate_value(self, key, value):
    obfuscator = self.__obfuscators.get(key)
    if obfuscator is not None:
        return obfuscator.obfuscate_value(value)
    else:
        return value

フリーズセットで動作させるためにこれを試しました:

def obfuscate_value(self, key, value):
    try:
        obfuscator = self.__obfuscators[key]
    except:
        return value
    return obfuscator.obfuscate_value(value)

しかし、これはそれを与え、属性を持っていないfrozenset does not have \__getitem__self.__obfuscators.__getattribute__(key)常に言います(これはキーという名前の関数を検索すると仮定しているため)辞書を不変にするより良い方法はありますか、またはキーに応じてオブジェクトを取得するにはどうすればよいですか?

編集:最終的に、dictをタプルにキャストしてからtuple(obfuscator.items()) 、独自の値検索関数を作成しました:

def find_obfuscator(self, key):
    for item in self.__obfuscators:
        x, y = item
        if self.case_insensitive:
            if x.lower() == key.lower():
                return y
        else:
            if x == key:
                return y

皆様のご尽力とご意見に感謝いたします。

4

5 に答える 5

0

ディクショナリを取り、get item 関数を持ち、set item を持たないラッパー クラスを作成できます。スレッドセーフとハッシングのためにいくつか追加する必要があるかもしれませんが、基本クラスはそれほど難しくありません。

于 2016-08-04T14:43:41.093 に答える
0

Since you mention tuple(dict) in your original post, probably the simplest solution to achieve what you want might simply be:

tuple(dict.items())
于 2016-08-04T15:02:51.790 に答える