Обновите переменную с помощью функции переключения в python

#json #python-3.x #dictionary

#json #python-3.x #словарь

Вопрос:

Я новичок в Python, пожалуйста, проявите немного сочувствия, если это очень странно, что я пытаюсь сделать, после нескольких попыток я не смог обновить определенные пары ключей в словаре в переменной (messageInit) с помощью переключателя функций (switcherMessage (args)), Моя цель — иметь возможностьдля запуска определенного метода, в зависимости от типа поступающего сообщения (в данном случае я представляю их с помощью переменных message), чтобы он обновлял только часть словаря (messageInit), а затем передавал указанные данные в другую функцию (otherTask (data)), которая в этомcase только печатает их. Самое странное, что для первого переключателя, если он работает (toActive ()), и он дает мне то, что я ожидаю (другие два — нет), но, честно говоря, я не понимаю, как переменные ведут себя в python, у меня есть опыт в js, но здесь я в замешательстве, поскольку для меня этодолжно быть обновлено только.

Я заранее признателен за любую помощь или подсказку.

 import json

# global dict to hold telemtry
messageInit = {
    'thingId': 'CarlosTal84-Hilda-mggbCoK1pihIqDJzJf3T',
    'active': 'false',
    'motorSpeed': 0,
    'colorValue': {
                    "r":0,
                    "g":0,
                    "b":0
                }
}

# print init data dict
print(f"init var: {messageInit}")

# other func
def otherTask(data):
    print(f"after task: {data}")

# function to handle the receive message
def on_message():

    # message bin arrival
    message =  b'{"active":"true"}'
    # message = b'{"motorSpeed": 20}'
    # message =  b'{"colorValue":{"r":2,"g":10,"b":100}}'

    # hold message in a var
    payload = str(message.decode('utf-8'))

    # print payload var with message
    # print(payload)

    # check if exist data in the payload
    if payload:

        # convert string in obj
        obj = json.loads(payload)

        # switcher func
        def switcherMessage(args):

            # methods
            def toActive():

                global messageInit
                # hold in vars
                messageActive = obj.get("active")
                messageInit.update({"active": messageActive})
                active = messageInit.get("active")
                return active

            def toMotorSpeed():

                global messageInit
                # hold in vars
                messageMotorSpeed = obj.get("motorSpeed")
                messageInit.update({"motorSpeed": messageMotorSpeed})
                motorSpeed = messageInit.get("motorSpeed")
                return motorSpeed

            def toColorValue():

                global messageInit
                # hold in vars
                messageColorValue = obj.get("colorValue")
                messageInit.update({"colorValue": messageColorValue})
                colorValue = messageInit.get("colorValue")
                return colorValue

            # dict switch
            switcher={
                'messageActive': toActive(),
                'messageMotorSpeed': toMotorSpeed(),
                'messageColorValue': toColorValue()
            }

            # return switcher
            return switcher.get(args, lambda:"Shit")

        # Driver program to switcher
        def wichMessage():

            if payload.find("active"):
                return 'messageActive'
            elif payload.find("motorSpeed"):
                return 'messageMotorSpeed'
            elif payload.find("colorValue"):
                return 'messageColorValue'

        # type of message var
        args = wichMessage()

        # run methods to fill vars
        print(switcherMessage(args))

        # other task
        otherTask(switcherMessage(args))

# run it
on_message()

# here the outputs for every switcher:
init var: {'thingId': 'CarlosTal84-Hilda-mggbCoK1pihIqDJzJf3T', 'active': 'false', 'motorSpeed': 0, 'colorValue': {'r': 0, 'g': 0, 'b': 0}}
true
after task: true
>>> 
# second message var
init var: {'thingId': 'CarlosTal84-Hilda-mggbCoK1pihIqDJzJf3T', 'active': 'false', 'motorSpeed': 0, 'colorValue': {'r': 0, 'g': 0, 'b': 0}}
None
after task: None
>>> 
# third message var 
init var: {'thingId': 'CarlosTal84-Hilda-mggbCoK1pihIqDJzJf3T', 'active': 'false', 'motorSpeed': 0, 'colorValue': {'r': 0, 'g': 0, 'b': 0}}
None
after task: None
>>> 
  

Комментарии:

1. Это много кода, который нужно изучить, но ваш switcher словарь выглядит не так. Обратите внимание, что когда вы это делаете switcher={'messageActive': toActive()} , toActive вызывается при создании словаря (и только в это время), а не при switcher.get(args, lambda:"Shit") вызове. Это означает, что все три из этих функций вызываются при switcher создании, а затем никогда больше (пока switcher не будет создано снова).

2. Спасибо!! Решите сейчас..