<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>