Vorrei creare una struttura dati che si comporti come un dizionario con una funzionalità aggiunta che tenga traccia di quali chiavi sono state "consumate". Si noti che non posso semplicemente inserire i valori mentre vengono riutilizzati.Dizionario Python con memoria delle chiavi a cui è stato effettuato l'accesso?
La struttura dovrebbe sostenere questi tre casi, cioè contrassegnare la chiave come consumato quando vi si accede come:
if key in d:
...
d[key]
d.get(key)
Questo è quello che ho scritto:
class DictWithMemory(dict):
def __init__(self, *args, **kwargs):
self.memory = set()
return super(DictWithMemory, self).__init__(*args, **kwargs)
def __getitem__(self, key):
self.memory.add(key)
return super(DictWithMemory, self).__getitem__(key)
def __contains__(self, key):
self.memory.add(key)
return super(DictWithMemory, self).__contains__(key)
def get(self, key, d=None):
self.memory.add(key)
return super(DictWithMemory, self).get(key, d)
def unused_keys(self):
"""
Returns the list of unused keys.
"""
return set(self.keys()).difference(self.memory)
Come io non sono molto familiare con l'interno di dict, c'è un modo migliore per raggiungere questo risultato?
quanto spesso si usa 'unused_keys()' ? se hai decorato il setter per aggiungere le chiavi a un set e getter per provare a rimuovere le chiavi da questo set, potrebbe avere una migliore perfomance - non sono sicuro della parte ** elegance **, pensato – Aprillion
A parte: perché "unused_keys" deve restituire un elenco? Non ha ordini intrinseci, quindi ha senso restituire un set. –
@Thomas K: Per motivi di simmetria, 'keys' restituisce una lista. – badzil