[Python-ideas] Support other dict types for type.__dict__
David Townshend
aquavitae69 at gmail.com
Sun Feb 26 10:42:54 CET 2012
On Feb 26, 2012 10:27 AM, "Simon Sapin" <simon.sapin at kozea.fr> wrote:
> Le 24/02/2012 00:34, Victor Stinner a écrit :
>
>> I'm trying to create read-only objects using a "frozendict" class.
>> frozendict is a read-only dict. I would like to use frozendict for the
>> class dict using a metaclass, but type.__new__() expects a dict and
>> creates a copy of the input dict.
>>
>> I would be nice to support custom dict type: OrderedDict and
>> frozendict for example. It looks possible to patch CPython to
>> implement this feature, but first I would like first to know your
>> opinion about this idea:-)
>>
>
> Hi,
>
> Combining ideas from other messages in this thread: would this work?
>
> 1. Inherit from frozendict
> 2. Define a __getattr__ that defers to frozendict.__getitem__
> 3. Use an empty __slots__ so that there is no "normal" instance attribute.
>
> Thinking about it a bit more, it’s probably the same as having a normal
> __dict__ and raising in __setattr__ and __delattr__. Isn’t this how you
> implement frozendict? (Raise in __setitem__, __delitem__, update, etc.)
>
> Regards,
> --
> Simon Sapin
> ______________________________**_________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/**mailman/listinfo/python-ideas<http://mail.python.org/mailman/listinfo/python-ideas>
Using frozendict, and especially inheriting from it sounds unnecessarily
complicated to me. A simple class which doesn't allow changes to instance
attributes could be implemented something like this:
class Three_inst:
@property
def value(self):
return 3
def __setattr__(self, attr, value):
raise AttributeError
def __delattr__(self, attr):
raise AttributeError
Or, if you're worried about changes to the class attributes, you could do
basically the same thing using a metaclass (python 2.7 syntax):
class FinalMeta(type):
def __setattr__(cls, attr, value):
if attr in cls.__dict__ or '__done__' in cls.__dict__:
raise AttributeError
else:
type.__setattr__(cls, attr, value)
def __delattr__(cls, attr):
raise AttributeError
class Three:
__metaclass__ = FinalMeta
value = 3
__done__ = True # There may be a neater way to do this...
Each of the following examples will fail:
>>> Three.another_value = 4
>>> Three.value = 4
>>> del Three.value
>>> three = Three(); three.value = 4
Actually, I think this is quite a nice illustration of what can be done
with metaclasses!
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20120226/c46e65f8/attachment.html>
More information about the Python-ideas
mailing list