在python中有没有等同于R的do.call的东西?
do.call(what = 'sum', args = list(1:10)) #[1] 55
do.call(what = 'mean', args = list(1:10)) #[1] 5.5
?do.call
# Description
# do.call constructs and executes a function call from a name or a function and a list of arguments to be passed to it.发布于 2016-08-02 22:13:15
这方面没有内置的功能,但是构造一个等价的功能非常简单。
您可以使用__builtin__ (Python2)或builtins (Python3)模块从内置名称空间中查找任何对象,然后使用*args和**kwargs语法对其应用任意参数:
try:
# Python 2
import __builtin__ as builtins
except ImportError:
# Python 3
import builtins
def do_call(what, *args, **kwargs):
return getattr(builtins, what)(*args, **kwargs)
do_call('sum', range(1, 11))一般来说,我们不会在Python中这样做。如果您必须将字符串转换为函数对象,则通常首选构建自定义字典:
functions = {
'sum': sum,
'mean': lambda v: sum(v) / len(v),
}然后从该字典中查找函数:
functions['sum'](range(1, 11))这使您可以严格控制动态代码可以使用的名称,防止用户通过调用内置的破坏性或破坏性影响来制造麻烦。
发布于 2016-08-02 22:20:12
do.call相当于Python语言中的splat operator:
def mysum(a, b, c):
return sum([a, b, c])
# normal call:
mysum(1, 2, 3)
# with a list of arguments:
mysum(*[1, 2, 3])注意,我必须定义自己的sum函数,因为Python的sum已经将list作为参数,所以您的原始代码应该是
sum(range(1, 11))R还有另一个特点:do.call在内部对其第一个参数执行函数查找。这意味着即使它是一个字符串而不是一个实际的函数,它也会找到该函数。上面的Python等价物没有做这个- see Martijn的答案来解决这个问题。
https://stackoverflow.com/questions/38722804
复制相似问题