empty classes as c structs?

Nick Coghlan ncoghlan at iinet.net.au
Sat Feb 5 10:49:28 EST 2005


Alex Martelli wrote:
> Nick Coghlan <ncoghlan at iinet.net.au> wrote:
>    ...
> 
>>Michael Spencer also posted an interesting idea recently about setting up
>>a view of an existing dictionary, rather than as a separate object:
>>
>>class attr_view(object):
>>   def __init__(self, data):
>>     object.__setattr__(self, "_data", data)
>>   def __getattr__(self, attrname):
>>     return self._data[attrname]
>>   def __setattr__(self, attrname, value):
>>     self._data[attrname] = value
> 
> 
> Wasted indirection, IMHO.  A better implementation:
> 
> class attr_view(object):
>     def __init__(self, data):
>         self.__dict__ = data
> 
> 
> Alex

Yeah, I caught your comment in the other thread. It was something I'd wondered 
about, but never followed up .

And any time you want real dictionary behaviour, a quick call to "vars(x)" will 
do nicely.

I think the idea definitely deserves mention as a possible implementation 
strategy in the generic objects PEP, with the data argument made optional:

class namespace(object):
     def __init__(self, data=None):
         if data is not None:
              self.__dict__ = data
     # Remainder as per Bunch in the PEP. . .

Py> result = namespace()
Py> result.x = 1
Py> result.y = 2
Py> vars(result)
{'y': 2, 'x': 1}
Py> gbls = namespace(globals())
Py> gbls.result
<__main__.namespace object at 0x00B2E370>
Py> gbls.result.x
1
Py> gbls.result.y
2
Py> gbls.gbls
<__main__.namespace object at 0x00B2E410>

This does mean construction using keywords or a sequence of pairs requires an 
extra call to dict() at the invocation point. However, it means that the class 
can also be used to manipulate an existing dictionary, which the current PEP 
version doesn't allow.

namespace(existing_dict) would mean that the namespace should manipulate the 
original dictionary.

namespace() would create a new, initially empty, dict to work on.

namespace(dict(<whatever>)) would create a new, non-empty, dict based on the 
standard arguments to the dictionary constructor.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at email.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://boredomandlaziness.skystorm.net



More information about the Python-list mailing list