Returning a tuple-struct

James Stroud jstroud at ucla.edu
Wed Jan 18 22:34:22 EST 2006


groups.20.thebriguy at spamgourmet.com wrote:
> I've noticed that there's a few functions that return what appears to
> be a tuple, but that also has attributes for each item in the tuple.
> For example, time.localtime() returns a time.time_struct, which looks
> like a tuple but also like a struct.  That is, I can do:
> 
> 
>>>>time.localtime()
> 
> (2006, 1, 18, 21, 15, 11, 2, 18, 0)
> 
>>>>time.localtime()[3]
> 
> 21
> 
>>>>time.localtime().tm_hour
> 
> 21
> 
> Anyway, I guess there's a few of ways to do this.  In the case above,
> it would seem reasonable to override __getitem__() and other things to
> get that result.
> 
> To my question... It seems like a useful but very simple way to
> accomplish the above (that is, to have your return value accessible as
> both a sequence and a struct) is to subclass tuple.  Something like
> this:
> 
> def foo():
>     class NewTuple(tuple): pass
>     x = NewTuple((1,2))
>     x.a, x.b = x
>     return x
> 
> And so I can do:
> 
> x = foo()
> print x
> print x.a
> print x.b
> 
> And the result is:
> 
> (1, 2)
> 1
> 2
> 
> So, the question I have is just a style and/or pattern question...
> Does anyone do this?  Does is seem reasonably intuitive, or ugly?  Is
> there a better way?  Thoughts?
> 
> -bri
> 

I think stylistically better might be

class NewTuple(tuple):
   def __new__(self, atup):
     self.a, self.b = atup[:2]
     return tuple.__new__(self, atup)

x = NewTuple((1, 2, 3, 4, 5))
print x
print x.a
print x.b




More information about the Python-list mailing list