Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将函数作为参数传递给lambda?_Python_Python 3.x_Lambda_Callback - Fatal编程技术网

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

Python 如何将函数作为参数传递给lambda?,python,python-3.x,lambda,callback,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 GPI

我尝试使用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)

假设
callback\u both()
被传递给单个参数
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\u both()
。为了完整起见,我只是将
pin
传递给
c1()
c2()
——您可以删除或忽略它。我们也可以使用
部分
而不是
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

你得想出另一个设计。传递给
add\u event\u detect
callback
函数仅使用
通道
(pin)参数调用是的,是的,但我不需要/希望在运行时调用c1/c2-这是我的编码错误。被接受的答案修复了它:
返回lambda pin:c1(pin)如果GPIO.input(pin)否则c2(pin)
def trigger_both(self, c1, c2):
    def callback_both(pin):
        return c1(pin) if GPIO.input(pin) else c2(pin)

    return callback_both