Использую Tornado версии 5 и Python 3.6
Есть обработчик Tornado, выглядящий примерно так:
class Cbclass Cb(TornadoBots):
bot = None
answer = None
data = dict()
@gen.coroutine
def post(self, *args, **kwargs):
bot_name, key = args
...
else:
self.__make_answer()
try:
self.__send_answer()
self.write('ok')
except Exception as e:
print(e)
...
def __make_answer(self):
msg = some_data
self.answer = answer.Vk(self.bot, msg)
if data and self.__check_new_message():
self.answer.handle()
else:
...
def __send_answer(self):
try:
if self.answer and self.answer.data:
return self.answer.send()
except Exception as e:
print(e)
И модуль answer, содержащий в себе классы Answer, Vk(Answer) и тд.
Все изменения атрибута data класса Vk(Answer) происходят только в одном методе
__prepare_answerdef __prepare_answer(self):
self.data.update({'peer_id': self.message.peer_id})
self.command = self.command(...)
self.command.run()
if self.command.data_type == 'action':
return
if ...:
self.data.update({self.command.data_type: self.command.data})
else:
self.data.update(self.command.data)
if ...:
self.data['message'] = tools.get_message('MAKE_ANSWER_ADD_VIP_EMOJI', {'my': self})
if ...:
self.data['forward_messages'] = ...
if ...:
self.data['keyboard'] = ...
if ...:
self.data['message'] += ...
После обработки команды, старые данные, которые после выполнения предыдущей команды остались в answer.data, каким-то чудесным образом попадают в новый объект.
Простой пример:
После первого выполнения в self.answer.data (класса Cb) у меня
{"attachment": "photoXXX_XXX,photoYYY_YYY"}
# потому что в методе __prepare_answer self.command.data = "photoXXX_XXX,photoYYY_YYY"
А после второго выполнения в self.answer.data (класса Cb) у меня
{"message": "Some Text", "attachment": "photoXXX_XXX,photoYYY_YYY"}
# хотя self.command.data = "Some Text"
Как эти данные могут попадать туда, ведь в Cb создаётся абсолютно новый объект answer.Vk?Проблема решается просто: в первой строке __prepare_answer вместо .update() использовать =, однако хочется устранить проблему целиком.