我正在尝试使用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)
答案 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()
传递给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
来做到这一点:
Still Works, Swift 5 Update
或者,再来一个简单的闭包:
datePicker.setValue(UIColor.white, forKeyPath: "textColor")