0

我正在尝试使用 lambda 作为处理 GPIO 按钮的上升/下降状态的一种方式。因此,我传递了下降 (c1) 和上升 (c2) 的回调,以创建稍后按下 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)
4

1 回答 1

0

假设callback_both()传递了单个参数pin,我们可能会使用一个简单的闭包

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
于 2019-12-26T03:14:01.997 回答