How to pass a reference to the current module

James Stroud jstroud at mbi.ucla.edu
Sat Aug 4 00:06:23 EDT 2007


Paul Rubin wrote:
> James Stroud <jstroud at mbi.ucla.edu> writes:
> 
>>      Module            Behavior
>>   ==============  ====================================================
>>    UserDefined1   Imports FunctionUser
>>    ThirdParty     Contains User Functions (May be ==UserDefined1)
>>    FunctionUser   do_something_with() and/or get_function_from_name()
>>
>>So the name-to-function mapping is done in FunctionUser but the
>>function is actually defined in UserDefined1 (or ThirdParty if
>>ThirdParty is different than UserDefined1).
> 
> 
> I'm still completely confused.  Does FunctionUser know what module the
> user functions are supposed to come from?  Could you give an example
> of what you want the actual contents of those 3 modules to look like?
> E.g.:
> 
>     UserDefined1.py:
>       import FunctionUser
> 
>       def foo(x):
>           print x+3
> 
>     FunctionUser.py:
>        def do_something_with (module, funcname, *args, **kw):
>          func = getattr(module, funcname)
>          func (*args, **kw)
> 
>     main.py:
>        import UserDefined1, FunctionUser
> 
>        # the following should print 10
>        FunctionUser.do_something_with(UserDefined1, 'foo', 7)
> 
> I don't think the above is quite what you want, but is it somewhere
> close?

Its very close. However, there is the possibiltiy that main.py and 
UserDefined1.py are the same module. In such a case I'm guessing that I 
need to resort to the gymnastics of frame inspection I mentioned 
earlier. The problem is when this combination of possibilities exists:

    1. main.py is named without the .py (e.g. `main`) as would be
       the convention for "programs"), and is not a true python
       module as a result--perhaps python has a mechanism for
       importing such files?
    2. foo is defined in `main`

Possibility two (even when it is a properly named module) sets the stage 
for a circular import, but I believe in python this is not entirely 
worrisome. However, the combination above makes it difficult to pass a 
reference to the `main` namespace without some sort of introspection. 
Ideally, I would prefer to not require the user to provide some mapping 
as it detracts from the convenience of the API. For example:

    from UserDefined1 import some_function
    def foo(): [etc.]
    def doit(): [etc.]
    mapping = {
                'foo' : foo,
                'doit' : doit,
                'some_function' : some_function
              }

The idea would be that the above mapping would be specified in the 
configuration file:

[foo]
param1 = float
param2 = 4

[option1]
__module__ = 'UserDefined1'
__function__ = 'doit'
param1 = str
param2 = 30.0

[doit]
param1 = float
param2 = float

[etc.]

James


-- 
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095

http://www.jamesstroud.com/



More information about the Python-list mailing list