On 01/20/2014 12:52 PM, Peter Otten wrote:
Charles Hixson wrote:

This is just a first sketch, and I haven't yet attempted to test it, so
what I'm hoping for is criticisms on the general approach.

class RODict:
      def __init__ (self, ddict = {}):
Default values are evaluted just once when the method is created. Mutable
default values mean trouble:

class D:
...     def __init__(self, dict={}):
...             self.dict = dict
...     def __setitem__(self, key, value):
...             self.dict[key] = value
...     def __repr__(self): return repr(self.dict)
...
d1 = D()
d2 = D()
d1[1] = 42
d2[2] = 42
d1
{1: 42, 2: 42}
d2
{1: 42, 2: 42}

          if not isinstance(ddict, dict):
              raise    TypeError("ddict must be a dict.  It is " +
repr(ddict))
          self._ddict    =    ddict
I think instead of the type check I would build a new dict from the
argument. The usual initializers

dict({1:2, 3:4})
dict([(1,2), (3,4)])
dict(a=1, b=2)

should work with your read-only dict.

      ##    Test for containment.
      #    @param    key    The item to be found.
      #    @return    True    If key is in the instance, otherwise False.
Docstrings are usually prefered over comments like the above.

      def __contains__(self, key):
          return    key in self._ddict
Did you know

http://docs.python.org/dev/library/collections.abc.html#collections.abc.Mapping

Subclass from it to ensure that all the usuall methods are defined.

That link, http://docs.python.org/dev/library/collections.abc.html#collections.abc.Mapping , is a very good one. I hadn't realized that it separated Mapping from MutableMapping. It would be nice if there were some examples of it's usage around, though. I can't really tell how to use it. (E.g., it mixes in __contains__, but it doesn't show how to specify what you are testing for cotainment in. So it looks as if I need to specify everything anyway because I can't tell what might be implemented in some inappropriate way.) OTOH, it's a good list of what needs to be implemented. (I see that I left out implementation of eq and ne, which is pretty straightfoward, but apparently needed (unless it's automatically being handled by the mixin...which I can't tell).

--
Charles Hixson

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to