[Python-Dev] PEP 435 - ref impl disc 2

Glenn Linderman v+python at g.nevcal.com
Sun May 5 08:46:53 CEST 2013


On 5/4/2013 11:31 PM, Glenn Linderman wrote:
> 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)'.
>
> 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.
>
> class NamedInt( int ):
>     _count = 0
>     def __new__( cls, *args, **kwds ):
>         name, *args = args
>         if len( args ) == 0:
>             args = [ cls._count ]
>             cls._count += 1
>         self = super().__new__( cls, *args, **kwds )
>         self._name = name
>         return self
>     def __init__( self, *args, **kwds ):
>         name, *args = args
>         super().__init__()
>     @property
>     def __name__( self ):
>         return self._name
>     def __repr__( self ):
>         # repr() is updated to include the name and type info
>         return "{}({!r}, {})".format(type(self).__name__,
>                                      self.__name__,
>                                      super().__repr__())
>     def __str__( self ):
>         # str() is unchanged, even if it relies on the repr() fallback
>         base = super()
>         base_str = base.__str__
>         if base_str.__objclass__ is object:
>             return base.__repr__()
>         return base_str()
>
>     # for simplicity, 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
>
> x = NamedInt('the-x', 1 )
> y = NamedInt('the-y', 2 )
> # demonstrate that NamedInt propagates the names into an expression syntax
> print( repr( x ), repr( y ), repr( x+y ))
>
> from ref435 import Enum
>
> # requires redundant names, but loses names in the expression
> class NEI( NamedInt, Enum ):
>     x = NamedInt('the-x', 1 )
>     y = NamedInt('the-y', 2 )
>
> print( repr( NEI( 1 )), repr( NEI( 2 )), repr( NEI(1) + NEI(2)))
>
> # looks redundant, and still loses the names in the expression
> class NEI2( NamedInt, Enum ):
>     x = x
>     y = y
>
> print( repr( NEI2( x )), repr( NEI2( x )), repr( NEI2(x) + NEI2(y)))

I've tried some more variations, without success:

print( repr( NEI( x )), repr( NEI( y )), repr( NEI( x ) + NEI( y )))
print( repr( NEI.x ), repr( NEI.y ), repr( NEI.x + NEI.y))
print( repr( NEI2.x ), repr( NEI2.y ), repr( NEI2.x + NEI2.y ))

Somehow, the overloading is not finding the __add__ operator in the 
NamedInt class, when the NamedInt's are wrapped in enumerations.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130504/8cdb8ab0/attachment.html>


More information about the Python-Dev mailing list