<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#330033" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 5/4/2013 11:31 PM, Glenn Linderman
      wrote:<br>
    </div>
    <blockquote cite="mid:5185FCB1.6030702@g.nevcal.com" type="cite">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      So I have a class based on Nick's Named Values, that has been
      extended to propagate names into expressions, so that if you have
      named values  'x' and 'y', when you   x + y, the result is a named
      value whose name is '(x + y)'.<br>
      <br>
      Seems pretty awkward to integrate this with Enum. Maybe I'm
      missing something.  Here's carved down code with just one operator
      defined for brevity.  The third item from each print statement
      should be the same, as far as I understand... but isn't.<br>
      <br>
      class NamedInt( int ):<br>
          _count = 0<br>
          def __new__( cls, *args, **kwds ):<br>
              name, *args = args<br>
              if len( args ) == 0:<br>
                  args = [ cls._count ]<br>
                  cls._count += 1<br>
              self = super().__new__( cls, *args, **kwds )<br>
              self._name = name<br>
              return self<br>
          def __init__( self, *args, **kwds ):<br>
              name, *args = args<br>
              super().__init__()<br>
          @property<br>
          def __name__( self ):<br>
              return self._name<br>
          def __repr__( self ):<br>
              # repr() is updated to include the name and type info<br>
              return "{}({!r}, {})".format(type(self).__name__,<br>
                                           self.__name__,<br>
                                           super().__repr__())<br>
          def __str__( self ):<br>
              # str() is unchanged, even if it relies on the repr()
      fallback<br>
              base = super()<br>
              base_str = base.__str__<br>
              if base_str.__objclass__ is object:<br>
                  return base.__repr__()<br>
              return base_str()<br>
      <br>
          # for simplicity, we only define one operator that propagates
      expressions<br>
          def __add__(self, other):<br>
              temp = int( self ) + int( other )<br>
              if isinstance( self, NamedInt ) and isinstance( other,
      NamedInt ):<br>
                  return NamedInt(<br>
                      '({0} + {1})'.format(self.__name__,
      other.__name__),<br>
                      temp )<br>
              else:<br>
                  return temp<br>
      <br>
      x = NamedInt('the-x', 1 )<br>
      y = NamedInt('the-y', 2 )<br>
      # demonstrate that NamedInt propagates the names into an
      expression syntax<br>
      print( repr( x ), repr( y ), repr( x+y ))<br>
      <br>
      from ref435 import Enum<br>
      <br>
      # requires redundant names, but loses names in the expression<br>
      class NEI( NamedInt, Enum ):<br>
          x = NamedInt('the-x', 1 )<br>
          y = NamedInt('the-y', 2 )<br>
      <br>
      print( repr( NEI( 1 )), repr( NEI( 2 )), repr( NEI(1) + NEI(2)))<br>
      <br>
      # looks redundant, and still loses the names in the expression<br>
      class NEI2( NamedInt, Enum ):<br>
          x = x<br>
          y = y<br>
      <br>
      print( repr( NEI2( x )), repr( NEI2( x )), repr( NEI2(x) +
      NEI2(y)))<br>
    </blockquote>
    <br>
    I've tried some more variations, without success:<br>
    <br>
    print( repr( NEI( x )), repr( NEI( y )), repr( NEI( x ) + NEI( y )))<br>
    print( repr( NEI.x ), repr( NEI.y ), repr( NEI.x + NEI.y))<br>
    print( repr( NEI2.x ), repr( NEI2.y ), repr( NEI2.x + NEI2.y ))<br>
    <br>
    Somehow, the overloading is not finding the __add__ operator in the
    NamedInt class, when the NamedInt's are wrapped in enumerations.<br>
  </body>
</html>