Per esempio, supponiamo che io voglia sottoclassare dicte avere tutte le chiavi in maiuscolo:
class capdict(dict):
def __init__(self,*args,**kwds):
super().__init__(*args,**kwds)
mod = [(k.capitalize(),v) for k,v in super().items()]
super().clear()
super().update(mod)
def __getitem__(self,key):
return super().__getitem__(key.capitalize())
def __setitem__(self,key,value):
super().__setitem__(key.capitalize(),value)
def __delitem__(self,key):
super().__detitem__(key.capitalize())
Questo funziona fino a un certo punto,
>>> ex = capdict(map(reversed,enumerate("abc")))
>>> ex
{'A': 0, 'B': 1, 'C': 2}
>>> ex['a']
0
ma, ovviamente, solo per i metodi che mi sono ricordato di implementare, per esempio
>>> 'a' in ex
False
non è il comportamento desiderato.
Ora, il modo pigro di compilare tutti i metodi che possono essere derivati da quelli "core" si mescolerebbe collections.abc.MutableMapping. Solo, non funziona qui. Presumo perché i metodi in questione ( __contains__nell'esempio) sono già forniti da dict.
C'è un modo per avere la mia torta e mangiarla? Qualche magia per far MutableMappingvedere solo i metodi che ho scavalcato in modo da reimplementare gli altri in base a quelli?
os._Environ.
MutableMapping. Vedi Dizionario senza distinzione tra maiuscole e minuscole .