【问题标题】:Function that takes a function with multiple arguments and returns a function with a single tuple argument接受具有多个参数的函数并返回具有单个元组参数的函数的函数
【发布时间】:2017-07-28 18:00:32
【问题描述】:

是否有高阶函数的标准名称,它接受一个具有多个参数的函数并返回一个具有单个元组参数的函数:

def what_am_i(f):
    def f1(tup):
        f(*tup)
    return f1 

这与大多数编程语言中的uncurry 不同,我通常将其定义为:

def uncurry(f):
    def f1(a, b):
        return f(a)(b)
    return f1

【问题讨论】:

  • 这类似于几种语言中的“可变长度参数列表”。

标签: python naming


【解决方案1】:

apply()

在 JavaScript 中,这称为apply()

'use strict'

function test(a, b, c) {
  // context
  console.log(this)
  // arguments
  console.log(a)
  console.log(b)
  console.log(c)
}

// first parameter is the context
test.apply('this', ['a', 'b', 'c'])

不幸的是,在this 不重要的许多情况下,第一个参数往往会使函数调用变得混乱,因此您可以传递nullundefined 之类的值,但在某些极端情况下它可以非常有用。

如果您只想指定数组,您可以实现一个与您的示例等效的包装函数,如下所示:

function test(a, b, c) {
  // arguments
  console.log(a)
  console.log(b)
  console.log(c)
}

// what am I? I am `apply()`
function apply(f) {
  return function (tup) {
    return f.apply(this, tup)
  }
}

var applied = apply(test)

applied(['a', 'b', 'c'])

spread()

您可以提出的另一个论点是将其称为spread(),因为spread syntax 做同样的事情:

function test(a, b, c) {
  console.log(a)
  console.log(b)
  console.log(c)
}

test(...['a', 'b', 'c'])

您可以实现一个非常直观的包装函数,如下所示:

function test(a, b, c) {
  console.log(a)
  console.log(b)
  console.log(c)
}

// what am I? I am `spread()`
function spread(f) {
  return function (tup) {
    return f(...tup)
  }
}

var spreaded = spread(test)

spreaded(['a', 'b', 'c'])

【讨论】:

  • 我认为 apply 在其他语言中意味着简单地使用提供的参数调用函数而不传播,但 spread(又名 splat)我喜欢。
猜你喜欢
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多