Comment puis-je faire comme "parfait" une sous-classe de dict que possible? L'objectif final est de pour avoir un simple dict dans lequel les touches sont minuscules.
Il semblerait que devrait être un petit ensemble de primitives que je peux remplacer à faire ce travail, mais toutes mes recherches et de tentatives ont fait croire que ce n'est pas le cas:
Si je remplacer
__getitem__
/__setitem__
, alorsget
/set
ne fonctionnent pas. Comment puis-je le faire fonctionner? Sûrement, je n'ai pas besoin de les mettre en œuvre individuellement?Suis-je prévenir le décapage de travail, et j'en ai besoin pour mettre en oeuvre
__setstate__
etc?Dois-je besoin d'
repr
,update
et__init__
?Devrais-je utiliser mutablemapping (il me semble que l'on ne devrait pas utiliser
UserDict
ouDictMixin
)? Si oui, comment? Les docs ne sont pas exactement en l'éclairant.
Voici mon premier aller à elle, get()
ne fonctionne pas, au moins, et sans doute il y a
beaucoup de petits problèmes subtils:
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
# http://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()