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
Schreibbeschränkung bei dictionaries
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.
Nachtrag:
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
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