class Namespace(object): # etc def _update_dict(self, other): for k in other: setattr(self, k, other[k])
This doesn't work, as it doesn't allow the sequence of 2-tuples. So I copied the relevant check for a keys() attribute from dict.update:
def _update_dict(self, other): """Allow subclasses to easily override handling of dict updates Also allows dotted names in the source to be handled correctly
Uses the "keys" attribute to identify mappings """ try: items = other.keys() except AttributeError: for k, v in other: setattr(self, k, v) else: for k in items: setattr(self, k, other[k])
Another change I made was to the Record class. It now uses __new__ to initialise the instance dictionary with the defaults from the subclass definition, leaving __init__ free to be used to invoke update() like it is for a standard namespace:
Py> from namespaces import Record Py> class Example(Record): ... a = 1 ... b = "" ... class _sub_sf(Record): ... c = 3 ... def _sub_calc(): return "Calculated value!" ... Py> x = Example() Py> x Example(a=1, b='', calc='Calculated value!', sf=_sub_sf(c=3)) Py> x = Example(a=3) Py> x Example(a=3, b='', calc='Calculated value!', sf=_sub_sf(c=3)) Py> x = Example([("sf.c", 5)], a=3, b="altered") Py> x Example(a=3, b='altered', calc='Calculated value!', sf=_sub_sf(c=5)) Py> x = Example({"sf.c": 5}, a=3, b="altered") Py> x Example(a=3, b='altered', calc='Calculated value!', sf=_sub_sf(c=5))
I also moved the module to my normal site: http://boredomandlaziness.skystorm.net/misc/namespaces.py
Steven: Feel free to pick through this for anything you want to add to the PEP. That's why I'm posting it, after all :)
Cheers, Nick.
-- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.skystorm.net -- http://mail.python.org/mailman/listinfo/python-list