pythonpython-importpython-modulepymcmcmc

Import a module with parameter in python


Is it possible to import a module with some parameter in python ?

All I mean by parameter is that there exists a variable in the module which is not initialized in that module, still I am using that variable in that module. In short, I want behavior similar to a function but unlike function, I want the variables of module to be exposed in the calling code.

eg a.py:

#lists like data, count, prob_distribution are constructed from training_pool (not initialized in this file)
x = pymc.Uniform('x', lower = 0, upper = 1)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]

b.py:

import a  #I want some way tr pass value of training_pool
m = pymc.MCMC(a)

I want all random variables in a.py to be exposed to MCMC. I am open to a better approach for my problem at hand, but I would also like to know whether passing arguments to modules is possible in python or not.


Solution

  • As @otus already answered, there is no way to pass parameters to modules.

    I think you are following some of the introductory examples for PyMC2, which use a pattern where a module wraps all the code for the nodes in a Bayesian model. This approach is good for getting started, but, as you have found, can be limiting, when you want to run your model with a range of variations.

    Fortunately, PyMC2 can create an MCMC object from a list or a dictionary as well as a module. What I recommend in this case is just what @oleg-s suggested in the comments: use a function. You can end the function with return locals() to get a dictionary of everything that would have been in the module, and this is suitable input to the pymc.MCMC constructor. Here is an example:

    # a.py
    from pymc import *
    
    count = [10, 10] # perhaps good to put this stuff in data.py
    prob_distribution = [[.5, .5], [.1, .2, .7]]
    data = [[2, 8], [2, 3, 5]]
    
    def model(training_pool):
        x = Uniform('x', lower = 0, upper = 1)
        rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in training_pool ]
    
        return locals()
    

    # b.py
    import pymc, a
    
    training_pool = [0]
    m = pymc.MCMC(a.model(training_pool))