[Python-ideas] PEP for enum library type?
Alex Stewart
foogod at gmail.com
Fri Feb 22 19:21:57 CET 2013
On Friday, February 22, 2013 4:53:27 AM UTC-8, Joao S. O. Bueno wrote:
> Again, I thinnkt hat my 2002 code that expected a (1) working when it
> got a (True) instead was a great, great thing. And I think that lots
> of places where magical strings today ("str.decode" errors argument,
> "compile" mode argument) should be lifted up to expect constants and
> still keep working if one pass them the strings "replace" or "eval".
>
Ok, first of all, nobody's suggesting that wouldn't work. I'm not talking
about comparing enums with base types (which I have no problem working like
this), I'm talking specifically about comparing enums directly with other
enums from a different category.
Requiring that things compare differently, IMHO, is too much
> statically-typed-minded - it is not the way of Python. As for Alex's
> surreal example of someone defining "NO" and "YES" with different
> values in different Enums and passing the wrong one to a given call -
> this person will have it comming.
I think this is unnecessarily dismissive. Obviously, my example was
simplified, but what if these two enums were created by two completely
different people in different modules that just happen to be used in the
same program? Does the hapless programmer "have it coming" then?
You say that my suggestion is more like C++ than Python, but I counter that
your suggestion seems to me a lot more like Perl than Python. It smacks of
one of the things I dislike most about Perl, which also happens to be, in
my opinion, one of the language features most responsible for (often
subtle) bugs in Perl code even by experienced programmers: The contents of
variables can have very different semantic meanings depending solely on the
context in which they're evaluated (scalar vs array, etc). In this case
what you're saying is that just because entirely unrelated programmers
happened to use the same int value underneath, that Align.TOP and
Errno.EPERM and Choice.OK should all be considered to mean exactly the same
thing everywhere (even if none of the programmers actually intended or
foresaw that possibility), but what that meaning is actually depends
entirely on what context they happen to be evaluated in.
Another way of looking at this is that what you're proposing is effectively
implicit type-casting between enums of different types. Python does
support implicit casting in a very few well-defined cases, but not most of
the time, and only when doing so does not discard important semantic
information (i.e. "meaning"). For ints, floats, etc, they really only have
one piece of semantic information ("a number value"). Enums, however, have
more than that. They have (potentially) a number value, but they also have
names, and they (preferably) have information about "what type of thing am
I". Automatically throwing out that extra information on a comparison
where both objects have the extra info and it's not the same on both
objects is, in my opinion, just wrong. If there were no extra semantic
meaning to enums, then this wouldn't be an issue, but the symbolic
information they carry is clearly important, because it's the whole reason
we're having this discussion in the first place instead of just using ints
everywhere.
(Indeed, it could easily be argued that the entire point to things like
int-enums is that the programmer isn't supposed to have to care what the
underlying value is, but should be able to think of things entirely
symbolically.)
In pretty much all the cases I can imagine (and that have been suggested
thus far), it seems to me that passing a different class of enum than the
other side is testing against is almost always going to be an accident, or
at the very least sloppy code (if there are cases where it is intentional,
it's unlikely to be common, and the programmer should be able to explicitly
cast between them somehow). Given this, I think that the Principle of
Least Surprise enters into things here as well. If somebody makes a coding
mistake and uses the wrong type of enum somewhere, which is likely to be
the least surprising outcome?:
1. If you use an enum of the wrong type, it won't be considered
equivalent to any of the expected options.
2. If you use an enum of the wrong type, it might not be considered to
be equivalent to any of the expected options, or it might match one of them
and do something either the same or completely different than you expect,
but you have no way to tell what will happen without looking at an
underlying constant which you're not supposed to have to care about.
--Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20130222/9f293ef3/attachment.html>
More information about the Python-ideas
mailing list