pyplusplus.code_repository.named_tuple

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