01.03.12 11:11, Victor Stinner написав(ла):
You can redefine dict.__setitem__.
Ah? It doesn't work here.
dict.__setitem__=lambda key, value: None
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
TypeError: can't set attributes of built-in/extension type 'dict'
Hmm, yes, it's true. It was too presumptuous of me to believe that you
have not considered such simple approach.
But I will try to suggest another approach. `frozendict` inherits from
`dict`, but data is not stored in the parent, but in the internal
dictionary. And even if dict.__setitem__ is used, it will have no
visible effect.
class frozendict(dict):
def __init__(self, values={}):
self._values = dict(values)
def __getitem__(self, key):
return self._values[key]
def __setitem__(self, key, value):
raise TypeError ("expect dict, got frozendict")
...
>>> a = frozendict({1: 2, 3: 4})
>>> a[1]
2
>>> a[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getitem__
KeyError: 5
>>> a[5] = 6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __setitem__
TypeError: expect dict, got frozendict
>>> dict.__setitem__(a, 5, 6)
>>> a[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getitem__
KeyError: 5
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com