How to get current module object

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Tue Feb 19 06:06:12 EST 2008


On 19 feb, 03:33, Alex <noname9... at gmail.com> wrote:
> GabrielGenellinawrote:
> > En Mon, 18 Feb 2008 14:49:02 -0200, Alex <noname9... at gmail.com> escribió:
> >> That's what I've been searching for, thanks. By the way, I know it might
> >> be trivial question... but function and class namespaces have __name__
> >> attribute too. Why is global one always returned?
> > I don't understand the question (even with the later correction  
> > namespaces->objects)
>
> There's no question anymore, I just failed to distinguish function local
> variables (which don't include __name__) and function object's attributes>>> Why do you want to get the module object? globals() returns the module
> >>> namespace, its __dict__, perhaps its only useful attribute...
>
> >> To pass it as a parameter to a function (in another module), so it can
> >> work with several modules ("plugins" for main program) in a similar  
> >> manner.
>
> > The function could receive a namespace to work with (a dictionary). Then  
> > you just call it with globals() == the namespace of the calling module.
>
> Yes, but access to module seems more verbose:
>
>  >>> module_dict['x']()
> xxx
>
> Instead of just:
>
>  >>> module.x()
> xxx

You could write a wrapper class on the client side, but I guess it's
easier to pass the module object directly, as you said earlier.
Anyway, this class would fake attribute access for dictionary entries:

py> class Idx2Attr(object):
...   def __init__(self, d): self.__dict__[None] = d
...   def __getattr__(self, name):
...     try: return self.__dict__[None][name]
...     except KeyError: raise NameError, name
...   def __setattr__(self, name, value):
...     self.__dict__[None][name]=value
...
py> import htmllib
py> dir(htmllib)
['AS_IS', 'HTMLParseError', 'HTMLParser', '__all__', '__buil
tins__', '__doc__', '__file__', '__name__', 'sgmllib', 'test
']
py> mod = Idx2Attr(htmllib.__dict__) # htmllib.__dict__ is what you
get if you use globals() inside htmllib
py> mod.__file__
'C:\\APPS\\PYTHON25\\lib\\htmllib.pyc'
py> mod.foo = 3
py> htmllib.foo
3

([None] is to avoid name collisions to some extent)

--
Gabriel Genellina



More information about the Python-list mailing list