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

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


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)))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130504/31397dda/attachment.html>


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /