On 05/13/2013 11:11 PM, Ethan Furman wrote:
On 05/13/2013 10:01 PM, Glenn Linderman wrote:
On 5/13/2013 7:36 PM, Ethan Furman wrote:
On 05/10/2013 10:15 PM, Glenn Linderman wrote:
So it is quite possible to marry the two, as Ethan helped me figure out using
an earlier NamedInt class:
class NIE( IntET, Enum ):
x = ('NIE.x', 1)
y = ('NIE.y', 2)
z = ('NIE.z', 4)
and then expressions involving members of NIE (and even associated integers)
will be tracked... see demo1.py.
But the last few lines of demo1 demonstrate that NIE doesn't like, somehow,
remember that its values, deep down under
the covers, are really int. And doesn't even like them when they are wrapped
into IntET objects. This may or may not
be a bug in the current Enum implementation.
[demo1.py excerpt]
print( repr( NIE1( 1 ) + NIE1(2)))
print( repr( NIE1( IntET('NIE1.x', 1 )) + NIE1(2)))
So the questions are:
1) Is there a bug in ref435 Enum that makes demo1 report errors instead of
those lines working?
Nope.
Well, if it isn't a bug, it will be interesting to read the documentation that
explains the behavior, when the
documentation is written:
The "obvious" documentation would be that Enum names values of any type,
particularly the first type in the
multiple-inheritance list. The values assigned to the enumeration members are
used as parameters to the constructor of
that first type, but the value of the enumeration member itself is an item of
the type, created by the constructor.
The __call__ syntax [ EnumDerivation( value ) ] looks up enumeration members
by value.
The obvious documentation would stop there.
The one piece of "marriage" that is interesting is to avoid specifying the name
twice, and it seems your code
I'd expect NIE1.x.value to be IntET('x', 1) but I'll have to look more
carefully at what you've done, when I have
some time next week. You may have made some "simplifying assumptions", and
things _should_ be as simple as possible, but
no simpler... especially not if it leads to unexpected results.
This will take more thought than I have time for tonight, also. Right now, I
think I want the value for NIE.x to be
IntET('NIE.x', 1 ). And your code isn't achieving that at present, but maybe I
just need to tweak __new__ and then
can... and maybe it cures the discrepancy in expectations mentioned earlier
too...
Thank you for being persistent. You are correct, the value should be an IntET
(at least, with a custom __new__ ;).
You know, when you look at something you wrote the night before, and have no idea what you were trying to say, you know
you were tired. Ignore my parenthetical remark.
Okay, the value is now an IntET, as expected and appropriate.
--
~Ethan~
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com