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

问题描述 投票:0回答:1

我正在尝试使用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)
python-3.x lambda callback
1个回答
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()-您可以删除或忽略它。我们可能还可以用partial代替lambda

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
© www.soinside.com 2019 - 2024. All rights reserved.