How can a function know what module it's in?

Rafe rafesacks at gmail.com
Tue Nov 11 23:49:31 EST 2008


On Nov 12, 11:17 am, Joe Strout <j... at strout.net> wrote:
> Some corrections, to highlight the depth of my confusion...
>
> On Nov 11, 2008, at 9:10 PM, Joe Strout wrote:
>
> >    doctest.testmod(mymodule)
>
> > This actually works fine if I'm importing the module (with the  
> > standard name) somewhere else
>
> Actually, it does not.
>
> > I noticed that a function object has a __module__ attribute, that is  
> > a reference to the module the function is in.
>
> And no, it isn't; it's the NAME of the module the function is in.  I'm  
> not sure what good that does me.  docstring.testmod does take an  
> optional "name" parameter, but the documentation (at least in 2.5.2)  
> does not explain what this parameter is used for.  I tried using it  
> thusly:
>
>         doctest.testmod(name=_test.__module__)
>
> but that didn't work; it appears to still be testing the __main__  
> module.  (Perhaps the name parameter is only used to describe the  
> module in the output, in which case, all I've accomplished here is  
> getting doctest to lie.)
>
> > I'm sure there is a magic identifier somewhere that lets a code get  
> > a reference to its own module, but I haven't been able to find it.  
> > Can someone share a clue?
>
> This question remains open.  :)
>
> Thanks,
> - Joe

import sys
this_module = sys.modules[__name__]

sys.modules is a dictionary of all modules which have been imported
during the current session. Since the module had to be imported to
access it, it will be in there. '__name__' is available inside
functions because it is in the module scope.

Classes are a little more tricky because doing something like:
this_module = sys.modules[self.__class__.__module__]
will return a different module if the class is inherited in a
different module (since the base class is __class__ now). However,
putting a function at the module level (in the super-class module)
should anchor the results (untested though).

I'm not sure if this is the answer you need with regards to doctest,
but it I think it answers the question in the subject of this thread.

- Rafe



More information about the Python-list mailing list