Python : Проблема с подсчётом номера сообщения
Всем доброго времени суток. При разработке своего приложения столкнулся с такой проблемой. При получении пользователем сообщения ему присваивается позиция.
Пример ответа на запрос о получении сообщений
{
"status": "SUC",
"Your": [],
"its": [
{
"picture": null,
"text": "Привет!",
"pos": 1,
"voice_text": "none",
"file": null,
"voice": "nil",
"filereso": null
},
{
"picture": null,
"text": "Как дела?",
"pos": 3,
"voice_text": "none",
"file": null,
"voice": "nil",
"filereso": null
}
]
}
Проблема заключается в следующем:
1)Иногда номер позиции "перескакивает" на единицу, т.е номер должен быть 2, а является 3
- Когда сообщение добавляется в массив, в который до этого добавили сообщение, позиция нового = позиции старого (т.е пользователь отправил сообщеие ,его позиция равна три, Пользователь сразу же отправляет ещё одно сообщение и его номер опять равен 3)
В чём проблема?
Проблемный участок кода
//если действие в запросе указано *отправить сообщение*
if data['action']=='send_mess':
rec_m='none'
PATH='audio.wav'
//для распознавания речи
if data['voice']!='nil':
with open("audio.wav", "wb") as fh:
fh.write(base64.standard_b64decode(data['voice']))
r=sr.Recognizer()
with sr.AudioFile(PATH) as source:
audio=r.record(source)
rec_m=r.recognize_google(audio)
print "transcribed:" + rec_m
if data['sender'] not in messgs[data['reciver']]:
messgs[data['reciver']][data['sender']]=[]
messgs[data['sender']][data['reciver']]=[]
message = {"text":data['text'],"picture":data['picture'],"voice":data['voice'], "voice_text":rec_m,"file":data['file'],"filereso":data['filereso'],"pos":1}
messgs[data['reciver']][data['sender']].append(message)
self.wfile.write(json.dumps({"status":"sended"} ))
else:
// проблемное место. Тут и ведётся посчёт
position=0
if len(messgs[data['reciver']][data['sender']])>len( messgs[data['sender']][data['reciver']]):
position=len(messgs[data['reciver']][data['sender']])+1
else :
position=len(messgs[data['sender']][data['reciver']])+1
message = {"text":data['text'],"picture":data['picture'],"voice":data['voice'], "voice_text":rec_m,"file":data['file'],"filereso":data['filereso'],"pos":position+1}
messgs[data['reciver']][data['sender']].append(message)
self.wfile.write(json.dumps(
{"status":"sended"}
))
Ответы (1 шт):
Автор решения: Егор Приставка
→ Ссылка
В общем, проблему я решил. Заключалась она в неправильном подсчёте номера последнего сообщения: он должен равняться сумме длин словарей переписок + 1 , а не длине самого длинного словаря+1. Исходя из этого, код преобразился в :
if data['action']=='send_mess':
rec_m='none'
if data['voice']!='nil':
with open("audio.wav", "wb") as fh:
fh.write(base64.decodebytes(data['voice']))
r=sr.Recognizer()
PATH='audio.wav'
with sr.AudioFile(PATH) as source:
audio=r.record(source)
rec_m=r.recgognize_sphinx(audio)
#print rec_m
if data['sender'] not in messgs[data['reciver']]:
message = {"text":data['text'],"picture":data['picture'],"voice":data['voice'], "voice_text":rec_m,"file":data['file'],"filereso":data['filereso'],"pos":1}
messgs[data['reciver']][data['sender']]=[]
messgs[data['reciver']][data['sender']].append(message)
self.wfile.write(json.dumps(
{"status":"sended"}
))
else:
pos=len(messgs[data['sender']][data['reciver']])+len(messgs[data['reciver']][data['sender']])+1
message = {"text":data['text'],"picture":data['picture'],"voice":data['voice'], "voice_text":rec_m,"file":data['file'],"filereso":data['filereso'],"pos":pos}
messgs[data['reciver']][data['sender']].append(message)
self.wfile.write(json.dumps(
{"status":"sended"}
))