首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当于python中的R的`do.call`

相当于python中的R的`do.call`
EN

Stack Overflow用户
提问于 2016-08-02 22:09:17
回答 2查看 2K关注 0票数 7

在python中有没有等同于R的do.call的东西?

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-02 22:13:15

这方面没有内置的功能,但是构造一个等价的功能非常简单。

您可以使用__builtin__ (Python2)或builtins (Python3)模块从内置名称空间中查找任何对象,然后使用*args**kwargs语法对其应用任意参数:

代码语言:javascript
复制
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中这样做。如果您必须将字符串转换为函数对象,则通常首选构建自定义字典:

代码语言:javascript
复制
functions = {
    'sum': sum,
    'mean': lambda v: sum(v) / len(v),
}

然后从该字典中查找函数:

代码语言:javascript
复制
functions['sum'](range(1, 11))

这使您可以严格控制动态代码可以使用的名称,防止用户通过调用内置的破坏性或破坏性影响来制造麻烦。

票数 5
EN

Stack Overflow用户

发布于 2016-08-02 22:20:12

do.call相当于Python语言中的splat operator

代码语言:javascript
复制
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作为参数,所以您的原始代码应该是

代码语言:javascript
复制
sum(range(1, 11))

R还有另一个特点:do.call在内部对其第一个参数执行函数查找。这意味着即使它是一个字符串而不是一个实际的函数,它也会找到该函数。上面的Python等价物没有做这个- see Martijn的答案来解决这个问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38722804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档