2

大文字と小文字を区別しないカスタム辞書を作成しようとすると、次のような不便で (私の観点からは) 予期しない動作が発生しました。からクラスを派生させる場合dict、オーバーロードされた,,関数は__iter__、に戻すときに無視されます。私はそれを次のテストケースに要約しました:keysvaluesdict

import collections

class Dict(dict):
    def __init__(self):
        super(Dict, self).__init__(x = 1)

    def __getitem__(self, key):
        return 2

    def values(self):
        return 3

    def __iter__(self):
        yield 'y'

    def keys(self):
        return 'z'

    if hasattr(collections.MutableMapping, 'items'):
        items = collections.MutableMapping.items
    if hasattr(collections.MutableMapping, 'iteritems'):
        iteritems = collections.MutableMapping.iteritems

d = Dict()
print(dict(d))              # {'x': 1}
print(dict(d.items()))      # {'y': 2}

keysvaluesおよび__iter__の値は、__getitem__どのメソッドが実際に呼び出されるかを示すためだけに矛盾しています。

ドキュメントにdict.__init__は次のように書かれています:

位置引数が指定され、それがマッピング オブジェクトである場合、マッピング オブジェクトと同じキーと値のペアを使用して辞書が作成されます。それ以外の場合、位置引数は反復子オブジェクトでなければなりません。

最初の文と、おそらく組み込み辞書の最適化に関係していると思います。

の呼び出しで,dict(d)を使用しないのはなぜですか? 何らかの方法で「マッピング」をオーバーロードして、コンストラクターにキーと値のペアのプレゼンテーションを使用させることは可能ですか?keys__iter__dict

なぜこれを使用したのですか?大文字と小文字を区別しないが保持する辞書の場合、次のことを行いました。

  • (lowercase => (original_case, value)) を内部に格納し、(any_case => value) として表示します。
  • チェックdictを使用するいくつかの外部ライブラリ コードを操作するための派生元isinstance
  • 2 つの辞書検索を使用しない: lower_case=>original_case、その後に original_case=>value (これは私が代わりに現在行っている解決策です)

適用事例にご興味のある方はこちら

4

2 に答える 2