[Python-Dev] other "magic strings" issues
Barry Warsaw
barry at python.org
Fri Nov 7 12:17:05 EST 2003
On Fri, 2003-11-07 at 11:08, Alex Martelli wrote:
> From Barry's discussion of the problem of "magic strings" as arguments to
> .encode / .decode , I was reminded of a blog entry,
>
> http://www.brunningonline.net/simon/blog/archives/000803.html
>
> which mentions another case of "magic strings" that might perhaps be
> (optionally but suggestedly) changed into more-readable attributes (in
> this case, clearly attributes of the 'file' type): mode arguments to 'file'
> calls. Simon Brunning, the author of that blog entry, argues that
>
> myFile = file(filename, 'rb')
>
> (while of course we're going to keep accepting it forever) is not quite as
> readable and maintainable as, e.g.:
>
> myFile = file(filename, file.READ + file.BINARY)
>
> Just curious -- what are everybody's feelings about that idea? I'm
> about +0 on it, myself -- I doubt I'd remember to use it (too much C
> in my past...:-) but I see why others would prefer it.
I'm with you: too much muscle memory to probably use it. But I still
think it's a good idea, with one caveat. A problem with constants like
this, especially if they're mapped to integers, is that printing them is
unhelpful:
>>> from socket import *
>>> print AF_UNIX
1
>>> from errno import *
>>> print EEXIST
17
If your memory is as bad as mine, how many times have /you/ typed
errno.errorcode[17]? :)
I would love it if what happened really was something like:
>>> from socket import *
>>> print AF_UNIX
socket.AF_UNIX
>>> from errno import *
>>> print EEXIST
errno.EEXIST
Now, I have an enum metaclass, originally ripped from Jeremy, but with a
few nice additions and modifications of my own, which would get us
closer to this. It allows you to define an enum like:
>>> class Family(enum.Enum):
... AF_UNIX = 1
... AF_INET = 2
... # ...
...
>>> Family.AF_UNIX
EnumInstance(Family, AF_UNIX, 1)
>>> Family.AF_UNIX == 1
True
>>> Family.AF_UNIX == 3
False
>>> [x for x in Family]
[EnumInstance(Family, AF_UNIX, 1), EnumInstance(Family, AF_INET, 2)]
>>> Family[1]
EnumInstance(Family, AF_INET, 2)
The last might be a tad surprising, but makes sense if you think about
it. :) Class Enum has a metaclass of EnumMetaclass, where all the fun
magic is <wink>. EnumInstances are subclasses of int and it would be
easy to make their __str__() be the nicer output format.
Anyway, if these type attribute constants like file.READ were something
like EnumInstances, then I think it would make writing and debugging
stuff like this much nicer.
> Another separate "attributes of types" issue raised by that same blog
> entry -- and that one does find me +1 -- is: isn't it time to make available
> as attributes of the str type object those few things that we still need
> to 'import string' for? E.g., the maketrans function (and maybe we could
> even give it a better name as long as we're making it a str.something?)...
+1-ly y'rs,
-Barry
More information about the Python-Dev
mailing list