【问题标题】:In Python, how do I pass parameters in a threaded callback?在 Python 中,如何在线程回调中传递参数?
【发布时间】:2015-06-07 16:58:25
【问题描述】:

基本上,我正在观察逻辑电平是否有某种变化,然后计算这种变化的持续时间。由于我有许多不同的线路要观看,因此我开始为每条线路创建一个函数。所以我想,我为什么不根据触发的线路创建一个使用不同参数的函数。

def myCallBack(pin, bool, Ftimer, Etimer):
    ## some more code here for checking bools and using timers

GPIO.add_event_detect(pin1, GPIO.both, callback=myCallBack(pin1, bool1, Ftimer1, Etimer1), bouncetime=200)
GPIO.add_event_detect(pin2, GPIO.both, callback=myCallBack(pin2, bool2, Ftimer2, Etimer2), bouncetime=200)
...

目前,我收到错误“TypeError: Parameter must be callable” 这种方法甚至可能吗?我会以正确的方式解决这个问题吗? 任何帮助,将不胜感激。 谢谢。

【问题讨论】:

    标签: python multithreading callback parameter-passing


    【解决方案1】:
    from functools import partial
    callback=partial(myCallBack, pin1, bool1, Ftimer1, Etimer1)
    

    这将产生一个没有参数的函数,在调用时调用 myCallBackpin1bool1Ftimer1Etimer1。或者,尝试:

    callback=lambda *a: myCallBack(pin1, bool1, Ftimer1, Etimer1)
    

    另见Python, how to pass an argument to a function pointer parameter?

    【讨论】:

    • 我仍然收到 'TypeError: Parameter must be callable' 我对 Partial 进行了更多研究,发现您可以在创建部分对象或调用它时添加参数。无论哪种方式,我仍然会遇到错误。如果我只是调用 myCallBack,它将很好地运行该函数。当我从 GPIO.add_event_detect 中调用它时似乎有问题
    • @MattMumm 你能试试上面的第二种方法吗?
    • 对不起,我因为某种原因错过了。刚试了一下,反应和你建议的第一种方法一样。
    • @MattMumm myCallBack 是一个函数吗?您能否为问题添加完整的回溯。
    【解决方案2】:

    我不确定为什么这可以解决我的问题,但它确实有效。我创建了一个类来制作对象,因为我在每条逻辑线上执行相同的功能集。我找到了这个stackoverflow link 并遵循了相同的模式。这对于我需要完成的工作来说很好。

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2017-03-27
      • 2022-01-12
      • 2011-08-19
      • 2021-02-08
      • 1970-01-01
      • 2021-11-22
      • 2020-09-13
      • 1970-01-01
      相关资源
      最近更新 更多