Как я могу сделать как можно более "совершенным" подклассом dict? Конечная цель состоит в том, чтобы иметь простое указание, в котором ключи должны быть строчными.
Казалось бы, должен быть какой-то крошечный набор примитивов, которые я могу переопределить, чтобы сделать эту работу, но, судя по всем моим исследованиям и попыткам, похоже, что это не так:
Если я переопределю
__getitem__
/__setitem__
, тоget
/set
не будут работать. Как я могу заставить их работать? Конечно, мне не нужно реализовывать их индивидуально?Могу ли я предотвратить травление и нужно ли использовать
__setstate__
и т.д.?Нужны ли
repr
,update
и__init__
?Должен ли я просто использовать mutablemapping (похоже, не следует использовать
UserDict
илиDictMixin
)? Если да, то как? Документы не совсем поучительны.
Вот мой первый пример, 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/info/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) does not 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()