[Tutor] Import module function using variable

Peter Otten __peter__ at web.de
Wed Jun 13 03:37:40 EDT 2018


Slater, Joseph C. wrote:

> Dear friends,
> 
> I am trying to import a function in a module by variable name. The
> specific example is that my function allows the user to select which
> function my code will use (in this case, which optimizer in scipy). There
> is a default for a named variable. I have thing working in a quite unclean
> way- I import them all and then look them up in globals. I'm not trying to
> clean it up.
> 
> Essentially I'd like to
> 
> method = 'newton_krylov'
> 
> chosen_optimize_func = (from scipy.optimize import method)
> 
> Of course, even I know this shouldn't work. What I tried is
> 
> solver_method = __import__('scipy.optimize.' + method, fromlist=[''])
> 
> which yields:
> 
---------------------------------------------------------------------------
> ModuleNotFoundError
>                        Traceback (most recent call last)
> 
> <ipython-input-28-f58650552981> in <module>()
> ----> 1 solver_method = __import__('scipy.optimize.' + method,
> fromlist=[''])
> 
> 
> 
> ModuleNotFoundError
> : No module named 'scipy.optimize.newton_krylov'
> 
> 
> Well, no, it's not a module but a function.

Indeed, the function is a name in a module, or an attribute of the module 
object. You need two steps to access it. First import the module, then use 
getattr() to extract the function, preferrably

>>> import scipy.optimize
>>> method = 'newton_krylov'
>>> chosen_optimize_func = getattr(scipy.optimize, method)
>>> chosen_optimize_func
<function newton_krylov at 0x7f0d0c270bf8>

but if the module varies, too, use import_module():

>>> import importlib
>>> getattr(importlib.import_module("scipy.optimize"), "newton_krylov")
<function newton_krylov at 0x7f0d0c270bf8>




More information about the Tutor mailing list