Python Idioms?
David Bolen
db3l at fitlinxx.com
Mon Jun 18 22:56:57 EDT 2001
"David Stanek" <no_spam..python at dstanek.com-NOSPAM> writes:
> In reading through the Python source code I came across some oddities. In
> some modules, specifically threading, the instance objects are created using
> a kind of factory method.
> e.g.
> class _X:
> pass
>
> def X(*tupArgs, **dicArgs):
> return apply(_X, tupArgs, dicArgs)
>
> When the class could just as easily been named X. Is there an advantage to
> doing things this way?
>
> Also I noticed in the same module:
> import sys
> _sys = sys
> del sys
>
> What does this do? You still have a reference to the module. What
> difference does it make what the name is.
Although it's rare, the threading module is one that has been designed
to be friendly in a "from threading import *" mode. My guess at the
rationale was a combination of the long module name, but also that the
module provides a number of threading primitives that are likely to be
heavily used within threading code.
When you use "from <module> import *" the import mechanism will
automatically skip over any entries in the module dictionary that
start with "_". So the threading module is conscientious about what
names it leaves in its module dictionary that don't start with "_" to
avoid polluting the importers namespace.
I'm not entirely sure about how the choice between module-level
factory functions and classes were made (for example, Thread is a
straight class), but one guess I'd made is that this helps prevent
subclassing of the basic primitives - at least not without violating
the "private" nature of the "_" classes.
--
-- David
--
/-----------------------------------------------------------------------\
\ David Bolen \ E-mail: db3l at fitlinxx.com /
| FitLinxx, Inc. \ Phone: (203) 708-5192 |
/ 860 Canal Street, Stamford, CT 06902 \ Fax: (203) 316-5150 \
\-----------------------------------------------------------------------/
More information about the Python-list
mailing list