1
2
3
4
5
6 file_name = "named_tuple.py"
7
8 code = \
9 """# Copyright 2004-2008 Roman Yakovenko.
10 # Distributed under the Boost Software License, Version 1.0. (See
11 # accompanying file LICENSE_1_0.txt or copy at
12 # http://www.boost.org/LICENSE_1_0.txt)
13
14 class named_tuple(tuple):
15 \"\"\"Creates tuple, which allows access to stored values by name and\\or by index.
16
17 Construction example: named_tuple( ('a',0), ('b',1) )
18 'a' and 'b' are names, while 0 and 1 are values
19 \"\"\"
20
21 def __new__(cls, *args):
22 return tuple.__new__( cls, [ val for name, val in args] )
23
24 def __init__(self, *args):
25 tuple.__init__( self )
26 self.__dict__[ '__name2value' ] = dict( args )
27
28 def __getattr__(self, name):
29 try:
30 return self.__dict__['__name2value'][ name ]
31 except KeyError:
32 raise AttributeError( "named_tuple has no attribute '%s'" % name )
33
34 def __setattr__(self, name, value):
35 raise AttributeError( "named_tuple has no attribute '%s'" % name )
36
37 def __getitem__( self, key ):
38 #TODO: it could be nice to support slicing. So the __getitem__ in case of
39 #slicing will return new named_tuple.
40 if isinstance( key, basestring ):
41 return self.__dict__['__name2value'][ key ]
42 else:
43 return super( named_tuple, self ).__getitem__( key )
44
45 if __name__ == '__main__':
46 nt = named_tuple( ('a',0), ('b',1) )
47 assert nt.a == 0 and nt.b == 1
48 a,b = nt
49 assert a == 0 and b == 1
50 assert nt[ "a" ] == 0 and nt[ "b" ] == 1
51
52 """
53