Python -如何“完美”地覆盖字典?

Python -如何“完美”地覆盖字典?,第1张

Python -如何“完美”地覆盖字典

你可以使用collections模块中的ABC(抽象基类)轻松编写一个行为类似于dict的对象。它甚至会告诉你是否错过了一种方法,因此以下是关闭ABC的最低版本。

import collectionsclass TransformedDict(collections.MutableMapping):    """A dictionary that applies an arbitrary key-altering       function before accessing the keys"""    def __init__(self, *args, **kwargs):        self.store = dict()        self.update(dict(*args, **kwargs))  # use the free update to set keys    def __getitem__(self, key):        return self.store[self.__keytransform__(key)]    def __setitem__(self, key, value):        self.store[self.__keytransform__(key)] = value    def __delitem__(self, key):        del self.store[self.__keytransform__(key)]    def __iter__(self):        return iter(self.store)    def __len__(self):        return len(self.store)    def __keytransform__(self, key):        return key

你可以从ABC获得一些免费方法:

class MyTransformedDict(TransformedDict):    def __keytransform__(self, key):        return key.lower()s = MyTransformedDict([('Test', 'test')])assert s.get('TEST') is s['test']   # free getassert 'TeSt' in s       # free __contains__   # free setdefault, __eq__, and so onimport pickleassert pickle.loads(pickle.dumps(s)) == s   # works too since we just use a normal dict

我不会

dict直
接继承(或其他内置)。这通常没有任何意义,因为你实际要做的是实现dict的接口。而这正是ABC的目的



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5108105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存