#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. Спасибо!! Решите сейчас..