[Python-ideas] Dict-like object with property access

Massimo Di Pierro massimo.dipierro at gmail.com
Mon Jan 30 19:49:54 CET 2012


Trying to make sure I understand where we disagree and perhaps explain my problem better. For me this has very little to do with dictionaries.

STEP 1) Today we can do this:

    class Dummy(object): pass

    d = Dummy()
    d.something = 5
    print d.something

Is anybody calling this un-pythonic?

STEP 2) We can now overload the [] to make the dynamic attributes accessible in an alternative syntax:

    class Dummy(object):
          def __getitem__(self,key): return getattr(self,key)
          def __setitem__(self,key,value): return setattr(self,key,value)
    d = Dummy()
    d.something = 5
    d['something'] = 5
    print d.something
    print d['something']

STEP 3) Is anybody calling this un-pythonic?

We can add redefine __getattr__ so that it never raises an exception:

STEP 4)
 class Dummy(object):
          def __getitem__(self,key): return getattr(self,key)
          def __setitem__(self,key,value): return setattr(self,key,value)
          def __getattr__(self,key):
                  return object.__getattr__(self,key) if hasattr(self,key) else Dummy()

Is this un-pythonic?

I do not think so but I do have a problem with it:

    class Dummy(object):
        def __getitem__(self,key): return getattr(self,key)
        def __setitem__(self,key,value): return setattr(self,key,value)
        def __getattr__(self,key):
            print 'wtf'
            return object.__getattr__(self,key) if hasattr(self,key) else None

    >>> d=Dummy()
    >>> print d.somethingelse
    wtf
    ... 334 wtf times with python2.7, 999 times with python2.5...
    wtf
    None

whatever this does internally, it makes some programs slower then I would like them to be. Why is it calling itself 334 times?

STEP 5) 
We can add methods to make this object behave like a dictionary by redefining d.keys() in terms of d.__dict__.keys() etc.

STEP 6)
we can re-factor it a bit so that actually class Dummy is derived from dict.

Is this the part that people do not like?


I would be happy if Python provided an efficient way to do something like STEP 4 without the problem I mentioned.
Perhaps there is one and I ignore it. I do not necessarily require STEP5 and STEP6.

Use case:

settings = Dummy()
settings.parameter1 = 'a'
settings.parameter2 = 'b'
etc.

if not settings.parameter1: do something ...

Massimo



On Jan 30, 2012, at 11:28 AM, Eric Snow wrote:

> On Mon, Jan 30, 2012 at 10:14 AM, Arnaud Delobelle <arnodel at gmail.com> wrote:
>> 
>> On Jan 30, 2012 4:23 PM, "Massimo Di Pierro" <massimo.dipierro at gmail.com>
>> wrote:
>>> 
>>> I do not think the issue is whether the people who use that semantic
>>> understand it or not. I can assure you they do and they know when it is
>>> appropriate to use it or not. The issue is whether there is any value is
>>> making it faster by including it in python or not. Because of the increasing
>>> popularity of JS I think new users are starting to expect something like it
>>> out of the box.
>> 
>> But this design decision in JavaScript is at the heart of many problems
>> (e.g. simply looping over keys is a pain).  That it is widely used doesn't
>> make it desirable. My experience with JavaScript is that we should keep this
>> 'feature' out of Python. If people want it they can implement it very easily
>> but encouraging them would be wrong.
> 
> +1




More information about the Python-ideas mailing list