[Tutor] SciPy Optimize-like calling function as string

Joseph Slater joseph.c.slater at gmail.com
Sat Feb 18 16:52:23 EST 2017


I'm trying to use the scipy.optimize code as an example to be able to avoid using *eval* to call a function named by a string. 

The following appears to be the code used to do this:
# from scipy optimize
> def wrap_function(function, args):
>     ncalls = [0]
>     if function is None:
>         return ncalls, None
> 
>     def function_wrapper(*wrapper_args):
>         ncalls[0] += 1
>         print(type(function))
>         return function(*(wrapper_args + args))
> 
>     return ncalls, function_wrapper


where I should be able to use it to make the following work:

> def sqr(x):
>     return x**2.
> 
> 
> func = 'sqr'
> 
> args=()
> fcalls, func = wrap_function(func, args)
> 
> x=3
> func(x)

where I get:

> <class 'str'>
> 
> ---------------------------------------------------------------------------
> TypeError
>                                  Traceback (most recent call last)
> 
> <ipython-input-32-832f2a14d895> in <module>()
>       7 
>       8 x=3
> ----> 9 func(x)
> 
> 
> 
> <ipython-input-19-6f99e62c64af> in function_wrapper(*wrapper_args)
>       8         ncalls[0] += 1
>       9         print(type(function))
> ---> 10         return function(*(wrapper_args + args))
>      11 
>      12     return ncalls, function_wrapper
> 
> 
> 
> TypeError: 'str' object is not callable


This works in *optimize* but not for me. What am I missing?

I've seen this done with dictionaries on some pages, but it seems that this is intended to be faster (which will become necessary for me in the future). 

Thanks,
Joe






More information about the Tutor mailing list