$ python example.py --function cos(x)
x = [...]
def foo(f, x):
return f(x)
有没有一种聪明的方法可以从命令行传递任何函数(让我们说numpy中为了简单而定义的任何数学函数),这样它就会产生相同的结果,产生下面的代码:
foo(lambda t: numpy.cos(t), x)
答案 0 :(得分:1)
正如您指定的 python2.7 ,您可以使用反向移植的importlib模块中的import_module
函数。
>>> np = importlib.import_module('numpy')
>>> cos = getattr(np, 'cos')
>>> cos
<ufunc 'cos'>
>>> cos(3.14159)
-0.99999999999647926
您需要解析命令行选项(使用argparse
作为@HenryKeiter在评论中建议),然后从模块字符串中拆分函数,导入模块并使用getattr访问函数。
>>> def loadfunc(dotted_string):
... params = dotted_string.split('.')
... func = params[-1]
... module = '.'.join(params[:-1])
... mod = importlib.import_module(module)
... return getattr(mod, func)
...
>>> loadfunc('os.getcwd')
<built-in function getcwd>
>>> loadfunc('numpy.sin')
<ufunc 'sin'>
>>> f = loadfunc('numpy.cos')
>>> f(3.14159)
-0.99999999999647926
请注意,这不会从全局命名空间加载函数,您可能希望添加一些错误检查。
修改强>
此行中也不需要lambda函数
foo(lambda t: numpy.cos(t), x)
你可以直接传递numpy.cos而不进行评估
foo(numpy.cos, x)