Как я могу сделать как можно более "совершенным" подклассом 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()