Python:从命令行传递库函数

时间:2014-02-26 00:34:33

标签: python python-2.7 numpy

$ python example.py --function cos(x)

x = [...]

def foo(f, x):
    return f(x)

有没有一种聪明的方法可以从命令行传递任何函数(让我们说numpy中为了简单而定义的任何数学函数),这样它就会产生相同的结果,产生下面的代码:

foo(lambda t: numpy.cos(t), x)

1 个答案:

答案 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)