Nick Coghlan wrote:
    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

Reply via email to