大文字と小文字を区別しないカスタム辞書を作成しようとすると、次のような不便で (私の観点からは) 予期しない動作が発生しました。からクラスを派生させる場合dict
、オーバーロードされた,,関数は__iter__
、に戻すときに無視されます。私はそれを次のテストケースに要約しました:keys
values
dict
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}
keys
、values
および__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 (これは私が代わりに現在行っている解決策です)
適用事例にご興味のある方はこちら