试图创建一个自定义的不区分大小写的字典,我遇到了以下不方便和(从我的角度来看)意外的行为。如果从 派生类,则在转换回 时会忽略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(d)
不使用任何keys
, __iter__
?是否可以以某种方式重载“映射”以强制dict
构造函数使用我的键值对表示?
我为什么用这个?对于不区分大小写但保留字典的字典,我想:
- 在内部存储 (lowercase => (original_case, value)),同时显示为 (any_case => value)。
- 派生自
dict
以使用一些使用isinstance
检查的外部库代码 - 不使用 2 个字典查找:lower_case=>original_case,然后是 original_case=>value(这是我现在正在做的解决方案)
如果您对应用案例感兴趣:这里是对应的分支