Can dictionary values access their keys?

Scott David Daniels Scott.Daniels at Acm.Org
Fri Apr 8 16:18:33 EDT 2005


Matthew Thorley wrote:
> Scott David Daniels wrote: ...(explaining Python has no "the" parent)
> I see what your saying, but I my situation the values of the dictionary
> are unique objects created by a parent object. 
But that is your convention, not Python's. Some good general rules:
   1) For frequent (or fast) access you should know where something is,
      rather than search for it.
   2) You (your app) should be willing to "pay" for your own needs for
      navigation rather than expect a built-in cost for everyone that
      provides convenience for a few.
   3) A very "Pythonic" storage system makes it clear how you navigate,
      so relying on magic is usually a bad idea.

> When the 'root object' is 'global' I see what your saying, but when
> 
> class A:
>   def __init__(self, container):
>     self.container=container
> 
> class B(dict):
>   def magice_get_parent(self):
>      ...
> 
> class special_value():
>   def __init__(self, val):
>      self.val = val
> 
>   def magic_get_key(self):
>     ...
> 
> parent = A(B)
> parent.container[x] = special_value(1)
> parent.container[y] = special_value(2)
> parent.container[z] = special_value(1)


OK, if you want help, try doing code, not sketching what it might be.
 > class special_value():
Cannot be.  Perhaps:
    class special_value(object):

 > class A:
 >   def __init__(self, container):
 >     self.container=container
...
 > class B(dict):
...
 > parent = A(B)
 > parent.container[x] = ...

Either you must use:
   parent = A(B())

or
   class A:
     def __init__(self, containerClass):
        self.container = containerClass()

By the way, if you are subclassing dict, you might as well
use new-style throughout (so: class A(object): ...).

Now, how about rather than all of this magic, trying:

   class A:
     def __init__(self, container):
        self.container = container
        self.container.parent = self

and instead of

>   parent.container[x] = special_value(1)

     parent.container.set(x, special_value(1))


using:
     class B(dict):
         ...
         def set(self, key, contents):
             self[key] = contents
             contents.origin = self, key
         ...

Then after:
     parent = A(B())
     parent.container.set(x, special_value(1))
     parent.container.set(y, special_value(2))
     parent.container.set(z, special_value(1))

You can do:

     child = parent.container
     print child.parent

     value1 = parent.container[x]
     box, key = value1.origin
     assert box[key] is value1 and box.parent is parent

And you didn't have to use magic at all.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list