如何将函数作为参数传递给lambda?

时间:2019-12-26 02:20:44

标签: python python-3.x lambda callback

我正在尝试使用lambda作为处理GPIO按钮的上升/下降状态的一种方式。因此,我传递了一个用于下降(c1)和上升(c2)的回调函数以创建一个lambda,稍后将在按下GPIO按钮时使用该lambda。但这不起作用:

# Create lambda to handle both rising and falling triggers/callbacks
def trigger_both( self, pin, c1, c2):
    return lambda pin, c1, c2: c1() if GPIO.input(pin) else c2()

c1和c2都是函数。执行lambda时在运行时出错:

TypeError:()缺少2个必需的位置参数:“ c1”和“ c2” TypeError:()缺少2个必需的位置参数:“ c1”和“ c2”

在上下文中:

    if callback and callback2:
        callback_both = self.trigger_both(pin, callback, callback2)
        GPIO.add_event_detect(pin, GPIO.BOTH, callback=callback_both, bouncetime=200)

1 个答案:

答案 0 :(得分:0)

假设将callback_both()传递给单个参数pin,我们可能会遇到一个简单的 closure

def trigger_both(self, c1, c2):
    return lambda pin: c1(pin) if GPIO.input(pin) else c2(pin)

如果没有,请考虑使用更长的格式:

def trigger_both(self, c1, c2):
    return lambda pin, f1=c1, f2=c2: f1(pin) if GPIO.input(pin) else f2(pin)

如果事件处理程序将pin传递给trigger_both(),则无需将pin传递给c1()。我只是将c2()传递给partiallambda以获得完整性-您可以删除或忽略它。我们可能也可以使用from functools import partial def trigger_both(self, c1, c2): def callback_both(f1, f2, pin): return f1(pin) if GPIO.input(pin) else f2(pin) return partial(callback_both, c1, c2) 而不是def trigger_both(self, c1, c2): def callback_both(pin): return c1(pin) if GPIO.input(pin) else c2(pin) return callback_both 来做到这一点:

Still Works, Swift 5 Update

或者,再来一个简单的闭包:

  datePicker.setValue(UIColor.white, forKeyPath: "textColor")