[Python-Dev] PEP 435 - ref impl disc 2 (original) (raw)

Ethan Furman ethan at stoneleaf.us
Tue May 7 03:26:56 CEST 2013


On 05/05/2013 01:01 AM, Glenn Linderman wrote:

The bigger problem is that the arithmetic on enumeration items, which seems like it should be inherited from NamedInt (and seems to be, because the third value from each print is a NamedInt), doesn't pick up "x" or "y", nor does it pick up "the-x" or "the-y", but rather, it somehow picks up the str of the value.

Indeed, the bigger problem is that we ended up have an (NamedInt, Enum) wrapping a NamedInt, so we had both NEI.x._intname /and/ NEI.x.value._intname, and it was just one big mess.

But I think it is solved. Try the new code. Here's what your example should look like:

 class NamedInt( int ):
     def __new__( cls, *args, **kwds ):
         _args = args
         name, *args = args
         if len( args ) == 0:
             raise TypeError("name and value must be specified")
         self = int.__new__( cls, *args, **kwds )
         self._intname = name
         return self
     @property
     def __name__( self ):
         return self._intname
     def __repr__( self ):
         # repr() is updated to include the name and type info
         return "{}({!r}, {})".format(type(self).__name__,
                                      self.__name__,
                                      int.__repr__(self))
     def __str__( self ):
         # str() is unchanged, even if it relies on the repr() fallback
         base = int
         base_str = base.__str__
         if base_str.__objclass__ is object:
             return base.__repr__(self)
         return base_str(self)
     # for testing, we only define one operator that propagates expressions
     def __add__(self, other):
         temp = int( self ) + int( other )
         if isinstance( self, NamedInt ) and isinstance( other, NamedInt ):
             return NamedInt(
                 '({0} + {1})'.format(self.__name__, other.__name__),
                 temp )
         else:
             return temp

 class NEI( NamedInt, Enum ):
     x = ('the-x', 1 )
     y = ('the-y', 2 )

 NEI.x + NEI.y

-- Ethan



More information about the Python-Dev mailing list