Могу ли я передать параметры в функции обратного вызова paho в python? - PullRequest
0 голосов
/ 04 июля 2019

Итак, я делаю программу на 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, но я бы очень хотел избежать этого, если это возможно. У кого-нибудь есть идеи?

Спасибо!

EDIT

Спасибо за помощь, ребята, я сделал смесь обоих предложений, и теперь у меня есть класс, который содержит как список, так и блокировку, поэтому я могу легко блокировать и разблокировать список, когда я над ним работаю.

1 Ответ

2 голосов
/ 04 июля 2019

Вы можете попробовать поместить все обратные вызовы как методы в классе. Тогда состояние может быть переменными, инициализированными в __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()
...