Package pyplusplus :: Package code_repository :: Module named_tuple

Source Code for Module pyplusplus.code_repository.named_tuple

 1  # Copyright 2004-2008 Roman Yakovenko.
 
 2  # Distributed under the Boost Software License, Version 1.0. (See
 
 3  # accompanying file LICENSE_1_0.txt or copy at
 
 4  # http://www.boost.org/LICENSE_1_0.txt)
 
 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