dynamism

Oren Tirosh oren-py-l at hishome.net
Tue Sep 10 05:23:32 EDT 2002


On Mon, Sep 09, 2002 at 11:45:35PM -0400, Raymond Hettinger wrote:
> >>> class BetterAttrDict(dict):
>  def __getattr__(self, key):
>   return dict.__getitem__(self, key)
> 
> 
> >>> bad = BetterAttrDict({'a': 1, 'b':2})
> >>> bad.a
> 1
> >>> bad.b
> 2

class EvenBetterAttrDict(dict):
    def __init__(self, d={}, **kw):
        """ Initialize from a mapping or using keyword=value pairs """
        dict.update(self, d)
        dict.update(self, kw)

    def __getattr__(self, key):
        """ Return dictionary items as members """
        return dict.__getitem__(self, key)

    def __setattr__(self, key, value):
        """ Set dictionary items as members """
        try:
            dict.__getattribute__(self, key)
        except AttributeError:
            dict.__setitem__(self, key, value)
        else:
            dict.__setattr__(self, key, value)

    def __delattr__(self, key):
        """ Delete dictionary items as members """
        try:
            dict.__getattribute__(self, key)
        except AttributeError:
            dict.__delitem__(self, key)
        else:
            dict.__delattr__(self, key)

    def __repr__(self):
        """ Display as a constructor call with keyword arguments """
        items = dict.items(self)
        items.sort()
        return "%s(%s)" % (
            self.__class__.__name__,
            ", ".join(
                ["%s=%s" % (k,`v`) for k,v in items]
            )
        )

    def __members__(self):
        """ Support dir(), rlcompleter attribute completion """
        return dict.keys(self)

    __members__ = property(__members__)



>>> class person(EvenBetterAttrDict): pass
...
>>> p = person(name='Oren', born=1971)
>>> p
person(born=1971, name='Oren')
>>> p.likes ='Chocolate!'
>>> p
person(born=1971, likes='Chocolate!', name='Oren')
>>>

Overkill? perhaps.

	Oren





More information about the Python-list mailing list