gpt4 book ai didi

python - 如何 "perfectly"覆盖字典?

转载 作者:IT老高 更新时间:2023-10-28 12:18:55 26 4
gpt4 key购买 nike

如何使 dict 的子类尽可能“完美”?最终目标是拥有一个简单的 dict,其中的键是小写的。

似乎应该有一些很小的原语集我可以重写以使其工作,但根据我所有的研究和尝试,情况似乎并非如此:

  • 如果我 override __getitem__/__setitem__ ,然后 get/set 不起作用。我怎样才能让它们工作?当然我不需要单独实现它们?

  • 我是否在阻止酸洗工作,是否需要实现 __setstate__ 等?

  • 我是 need repr, update and __init__ ?

  • 我应该只是use mutablemapping (似乎不应该使用 UserDictDictMixin)?如果是这样,怎么做?这些文档并不完全有启发性。

这是我第一次尝试,get() 不起作用,毫无疑问还有许多其他小问题:

class arbitrary_dict(dict):
"""A dictionary that applies an arbitrary key-altering function
before accessing the keys."""

def __keytransform__(self, key):
return key

# Overridden methods. List from
# https://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict

def __init__(self, *args, **kwargs):
self.update(*args, **kwargs)

# Note: I'm using dict directly, since super(dict, self) doesn't work.
# I'm not sure why, perhaps dict is not a new-style class.

def __getitem__(self, key):
return dict.__getitem__(self, self.__keytransform__(key))

def __setitem__(self, key, value):
return dict.__setitem__(self, self.__keytransform__(key), value)

def __delitem__(self, key):
return dict.__delitem__(self, self.__keytransform__(key))

def __contains__(self, key):
return dict.__contains__(self, self.__keytransform__(key))


class lcdict(arbitrary_dict):
def __keytransform__(self, key):
return str(key).lower()

最佳答案

你可以很容易地用ABC 编写一个行为类似于dict 的对象。 s(抽象基类)来自 collections.abc模块。它甚至会告诉您是否错过了某个方法,因此以下是关闭 ABC 的最小版本。

from collections.abc import MutableMapping


class TransformedDict(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 get
assert 'TeSt' in s # free __contains__
# free setdefault, __eq__, and so on

import pickle
# works too since we just use a normal dict
assert pickle.loads(pickle.dumps(s)) == s

我不会直接继承 dict (或其他内置函数)。这通常是没有意义的,因为你真正想做的是实现一个dict的接口(interface)。这正是 ABC 的用途。

关于python - 如何 "perfectly"覆盖字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com