Implementing Tuples with Named Items

Peter Otten __peter__ at web.de
Tue Jan 10 10:40:18 CET 2006


Bryan wrote:

> in the python cookbook 2nd edition, section 6.7 (page 250-251), there a
> problem
> for implementing tuples with named items.  i'm having trouble
> understanding how one of commands work and hope someone here can explain
> what exactly is going on.
>   without copying all the code here, here is the gist of the problem:
> 
> from operator import itemgetter
> 
> class supertup(tuple):
>      def __new__(cls, *args):
>          return tuple.__new__(cls, args)
> 
> setattr(supertup, 'x', property(itemgetter(0)))
> 
>  >>> t = supertup(2, 4, 6)
>  >>> t.x
>  >>> 2
> 
> 
> i understand what itemgetter does,
> 
>  >>> i = itemgetter(0)
>  >>> i((2, 3, 4))
>  >>> 2
>  >>> i((4, 8, 12))
>  >>> 4
> 
> i understand what property does, and i understand what setattr does.  i
> tested this problem myself and it works, but i can't understand how t.x
> evaluates to 2 in this case.  how does itemgetter (and property) know what
> tuple to use? in my itemgetter sample, the tuple is passed to itemgetter
> so it's obvious to see what's going on.  but in the supertup example, it 
> isn't obvious to me. 

Perhaps it helps to see the "intermediate" steps between a standard property
definition and your setattr() example:

>>> class supertup(tuple):
...     def getx(self): return self[0]
...     x = property(getx)
...     gety = itemgetter(1)
...     y = property(gety)
...     z = property(itemgetter(2))
...
>>> supertup.t = property(itemgetter(3))
>>> setattr(supertup, "u", property(itemgetter(4)))
>>> t = supertup(range(5))
>>> t.u, t.t, t.z, t.y, t.x
(4, 3, 2, 1, 0)

class T:
   def method(self): pass

and

class T:
   pass

def method(self): pass
T.method = method

are both creating a class 'T' with a method 'method'. setattr() is only
needed if you don't know the attribute's name at compile time -- a method
is just and attribute of a class object.

Peter



More information about the Python-list mailing list