我可以在 python 中将参数传递给 paho 回调函数吗?
Can I pass in parameters to paho callback functions in python?
所以我正在制作一个 python 程序来跟踪主题上的 mqtt 连接,这样我就可以拥有一个连接仪表板。我有一个变量,我想将其传递给 on_message
函数,以便我可以修改它并打印出来。
我已经知道我可以通过将变量声明为 global
来创建它,但根据我的经验,无论如何都要避免声明为 global
,所以我'我想知道是否有其他方法。
(为了便于阅读,对代码进行了删减)
def process_message(client, userdata, message):
global connected_list
# mess around with it and exit the callback
if __name__ == "__main__":
connected_list = []
# set up the mosquitto client and then
client.on_message = process_message
# tell it to subscribe and connect and then
client.loop_forever()
基本上我知道它可以用 global
来完成,但如果可能的话我很想避免它。有人有什么想法吗?
谢谢!
编辑
感谢大家的帮助,我结合了这两种建议,现在有了一个包含列表和锁的 class,所以我可以在需要时轻松锁定和解锁列表对其进行操作。
您可以尝试将所有回调作为方法放在 class 中。然后状态可以是在 __init__
中初始化的变量而不是全局变量。这大大提高了代码的可重用性。
class Handler:
def __init__(self):
self.connected_list = []
def process_message(self, client, userdata, message):
connected_list = self.connected_list
# mess around with it and exit the callback
if __name__ == "__main__":
handler = Handler()
client.on_message = handler.process_message
# tell it to subscribe and connect and then
client.loop_forever()
所以我正在制作一个 python 程序来跟踪主题上的 mqtt 连接,这样我就可以拥有一个连接仪表板。我有一个变量,我想将其传递给 on_message
函数,以便我可以修改它并打印出来。
我已经知道我可以通过将变量声明为 global
来创建它,但根据我的经验,无论如何都要避免声明为 global
,所以我'我想知道是否有其他方法。
(为了便于阅读,对代码进行了删减)
def process_message(client, userdata, message):
global connected_list
# mess around with it and exit the callback
if __name__ == "__main__":
connected_list = []
# set up the mosquitto client and then
client.on_message = process_message
# tell it to subscribe and connect and then
client.loop_forever()
基本上我知道它可以用 global
来完成,但如果可能的话我很想避免它。有人有什么想法吗?
谢谢!
编辑
感谢大家的帮助,我结合了这两种建议,现在有了一个包含列表和锁的 class,所以我可以在需要时轻松锁定和解锁列表对其进行操作。
您可以尝试将所有回调作为方法放在 class 中。然后状态可以是在 __init__
中初始化的变量而不是全局变量。这大大提高了代码的可重用性。
class Handler:
def __init__(self):
self.connected_list = []
def process_message(self, client, userdata, message):
connected_list = self.connected_list
# mess around with it and exit the callback
if __name__ == "__main__":
handler = Handler()
client.on_message = handler.process_message
# tell it to subscribe and connect and then
client.loop_forever()