Get importer module from imported module

dody suria wijaya dodysw at gmail.com
Mon Feb 7 06:41:51 EST 2005


Thank you for such a quick reply. There were some details I
had left behind related to my case that I guess would now
need to be told to better illustrate the problem.

I have many different module of "a", let's called it a1, a2 ...
a100, and there is only one module "b". Here's a better
example (and using some of your tips):

#Module a1
import b
class Main(b.Basic): pass

#Module a2
import b
class Main(b.Basic): pass

#Module a3
import b
class Main(b.Basic): pass

.
.
.

#Module b
class Basic: pass
class SaltyMixIn: pass
class SugaryMixIn: pass
def Salty():
    class Food(SaltyMixIn,module_importing_me.Main): pass
    return Food()
def Sweet():
    class Food(SugaryMixIn,module_importing_me.Main): pass
    return Food()

#Module c
import sys
food_no = sys.argv[1]
m = __import__(food_no)
goodie = m.Salty()


"import a" inside b would not solve the problem, since there
are many "module a" and module b does not know beforehand
which module had imported it. I could, say, put these
additional lines on all "module a" (which I previously had
and worked):

#Module a1
import b
class Main(b.Basic): pass
class Salty(SaltyMixIn,Main): pass      # new
class Sweet(SaltyMixIn,Main): pass      # new


but dislike it for personal taste; code dupes (there could
be a lot of food flavouring), and sheer messiness.


-- 
  dody suria wijaya
  YahooMsgr ID: dody

Monday, February 7, 2005, 6:10:14 PM, you wrote:

DB> dody suria wijaya wrote:

>> 
>> I found this problem when trying to split a module into two.
>> Here's an example:
>> 
>>==============
>> #Module a (a.py):
>> from b import *
>> class Main: pass
>>==============
>> 
>>==============
>> #Module b (b.py)
>> def How():
>>     Main_instance = module_a.Main()
>>     return Main_instance
>>==============
>> 
>>> import a
>>> a.How()
>> 
>> 
>> the problem would show at How() function. I have been unable
>> to get variable pointing to module a from inside module b.
>> In short, I need to have a variable pointing to the module
>> whose importing me.
>> 
>> 

DB> 'import a' will let you reference module 'a',
DB> unless 'a' was invoked as a 
DB> script in which case you would need 'import __main__'.

DB> #Module b (b.py)
DB> import a
DB> def How():
DB>     Main_instance = a.Main()
DB>     return Main_instance

DB> But: keep in mind that all statements (except
DB> 'global') are executable in 
DB> Python, so you must not call How() until after the Main class has actually
DB> been created. This is one reason why it is
DB> generally safer to import a 
DB> module and do the lookup when you need it instead of using 'from
DB> amodule import *' which can only get at the names which exist at the time
DB> it is executed.

DB> A better solution  would be to structure your code so that your modules
DB> don't have any mutual dependencies. If your
DB> function 'How()' is in module b 
DB> then just call 'b.How()' wherever you use it and lose the import of 'b'
DB> from 'a' altogether.




More information about the Python-list mailing list