通过对dict 进行子类化并将保护添加到__setitem__、.update() 和.setdefault();添加一个从默认值获取类型的.fromkeys() 类方法是一个不错的额外功能:
from itertools import tee
class MyTypeDict(dict):
def __init__(self, type_=SomeType, *args, **kw):
self.type = type_
super(MyTypeDict, self).__init__(*args, **kw)
for val in self.itervalues():
self._checktype(val)
@classmethod
def fromkeys(cls, seq, value=SomeType()):
res = cls(type_=type(value))
res.update((k, value) for k in seq)
return res
def _checktype(self, value):
if not isinstance(value, self.type):
raise TypeError('Value type {!r} not allowed'.format(type(value)))
def __setitem__(self, key, value):
self._checktype(value)
super(MyTypeDict, self).__setitem__(key, value)
def update(self, other):
# Loop over other, either a dict or an iterable (use a copy with `tee`)
# for python 3, use `items()` instead.
items = other.iteritems() if hasattr(other, 'iteritems') else tee(other)
for key, value in items:
self._checktype(value)
super(MyTypeDict, self).update(other)
def setdefault(self, key, default=None):
if default is None:
default = self.type() # assumes no-args initializer
else:
self._checktype(default)
return super(MyTypeDict, self).setdefault(key, default)
将其用作:
mydict = MyTypeDict(type_=SomeType)