embarrassing class question

Robert Kern robert.kern at gmail.com
Thu Oct 21 21:41:37 CEST 2010

On 10/21/10 2:12 PM, Brendan wrote:
> On Oct 21, 3:56 pm, Ethan Furman<et... at stoneleaf.us>  wrote:
>> Jonas H. wrote:
>>> On 10/21/2010 08:09 PM, Brendan wrote:
>>>> Two modules:
>>>> x.py:
>>>> class x(object):
>>>>       pass
>>>> y.py:
>>>> from x import x
>>>> class y(x):
>>>>       pass
>>>> Now from the python command line:
>>>>>>> import y
>>>>>>> dir(y)
>>>> ['__builtins__', '__doc__', '__file__', '__name__', '__package__',
>>>> 'x', 'y']
>>>> I do not understand why class 'x' shows up here.
>>> Because that's how `import` behaves. It imports *every* member of the
>>> module into the importing module's global namespace (except for
>>> attributes that start with an underscore).
>> Um, no.  (unless you do "from<whatever>  import *" at the module level)
>> What it does is add whatever you imported into the namespace where you
>> imported it.
>> Because y.py has "from x import x" the x class from x.py is added to the
>> y.py namespace.
>> ~Ethan~- Hide quoted text -
>> - Show quoted text -
> So what is usually done to prevent this? (In my case not wanting class
> x added to the y.py namespace)
> It seems sloppy.

You can explicitly delete it at the end of the file if you never reference it 
from one of your methods.

Mostly though, it just doesn't matter much. I recommend leaving it alone. If you 
want a nice, clean namespace for people to use, make a module (e.g. api.py) that 
doesn't define any classes or functions but just imports them from their 
defining modules.

Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco

More information about the Python-list mailing list