accessing variable of the __main__ module

News123 news1234 at free.fr
Sat Mar 20 09:32:03 EDT 2010


Hi Steven,








Steven D'Aprano wrote:
> On Sat, 20 Mar 2010 13:16:08 +0100, News123 wrote:
> 
>> Hi,
>>
>>
>> I wondered about the best way, that a  module's function could determine
>> the existance and value of variables in the __main__ module.
>>
>>
>> What I came up with is:
>> ########### main.py ##########
>> import mod
>> A = 4
>> if __name__ == "__main__": mod.f()
>> ########### mod.py ##########
>> def f():
>>     try:
>>         from __main__ import A
>>     except ImportError as e:
>>         A = "does not exist"
>>     print "__main__.A" ,A
>>
>> Is there anything better / more pythonic?
> 
> 
> First problem:
> 
> You try to import from "__main__", but the other module is called "main". 
> __main__ is a special name, which Python understands as meaning "this 
> module that you are in now". For example:
My choice of names was perhaps not very smart.
I could have called main.py also mytoplevel.py


> 
> $ cat test_main.py
> x = "something special"
> import __main__  # magic alias for this module
> print __main__.x
> 
> $ python test_main.py
> something special
> 
> So inside "mod.py", the line "from __main__ import A" tries to import A 
> from mod.py, not from main.py. You need to say "from main import A" 
> instead.
> 
I think you're wrong, my above code seems to work.
__main__  refers not to the current module, but to the urrent
'top-level-module'
so
from __main__ import A tries to import from the top level module which
is in my case main.py.


> But if you do this, it creates a second problem: you have a circular 
> import, which is generally considered a Bad Thing. The problem is that:
> 
> (1) module main tries to import module mod
> (2) module mod tries to import module main
> (3) but main is still waiting for mod to be imported
> 
> Now, in your case you escape that trap, because the import is inside a 
> function, so it doesn't occur until you call the function. But it is 
> still considered poor practice: it is best to avoid circular imports 
> unless you really, really need them.
> 
> 
> The question is, why does module mod.py care what is happening in 
> main.py? It is better for mod.py to be self-contained, and not care about 
> main.py at all. If it needs A, let the caller pass A to it:


The reason is pure lazyness.
I would like to 'try' something quickly.

I have a module used by many different python programs.

In case the __main__  module contains a certain object I'd like to
extract information from this object if not not.

This is for debug, not for 'production'.

I'd prefer to change only one file and not many.


> 
> ########### main.py ##########
> import mod
> A = 4
> if __name__ == "__main__":
>     mod.f(__name__, A)
> 
> ########### mod.py ##########
> def f(caller, A):
>     print "%s.A: %s" % (caller, A)
> 
> 
> 

N



More information about the Python-list mailing list