Schreibbeschränkung bei dictionaries

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

Hallo,

gibt es die Möglichkeit bei einem dictionary ab einem bestimmten Zeitpunkt zu sagen dass keine neuen keys mehr erlaubt werden, aber die vorhandenen values noch verändert werden können?
Hintergrund: Ich will Parameter aus einem ASCII-File parsen und diese in ein dictionary stecken. Da nicht notwendigerweise alle Parameter im File vorkommen, will ich das parameter dictionary erst mit default-Werten initialisieren. Wenn ich jetzt im eigentlichen parsing code einen Tippfehler bei einem key mache, habe ich einen zusätzlichen ungewollten key, und der eigentliche key hat den falschen Wert, was zu fiesen bugs führen könnte.
Eine Möglichkeit dies zu vermeiden wäre doch eine Block Methode, die eine exception wirft wenn man einen nicht vorhandenen key verwendet.
Gibt es eine (Standarad)-Klasse die dieses Feature bietet?
Oder welche Tricks gibt es um sich selber möglichst einfach vor solchen Tippfehlern zu schützen?

Schöne Grüße,
Johannes
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Du könntest von dict erben und die __setitem__ Methode überschreiben. Darin könntest du dann prüfen, ob der key bereits existiert und dann entsprechend handeln. Oder du schreibst dir eine dict_setter Funktion, die du benutzt, um Werte zu setzen.

Code: Alles auswählen

# ungetestet
def dict_setter(container, key, value):
    if key in container.keys():
        container[key] = value
        return container
    else:
        # mach was anderes
Nachtrag:

Code: Alles auswählen

class Container(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        
    def __setitem__(self, key, value):
        if key in self.keys():
            dict.__setitem__(self, key, value)
        else:
            raise TypeError('foobar')
            
a = Container(a=1, b=2)
print a
a['a'] = 3
a['c'] = 3
{'a': 1, 'b': 2}
Traceback (most recent call last):
File "sortobj.py", line 14, in <module>
a['c'] = 3
File "sortobj.py", line 9, in __setitem__
raise TypeError('foobar')
TypeError: foobar
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

Vielen Dank, das sieht doch genau nach dem aus was ich gesucht hab!
Antworten