YardalGedal
@YardalGedal
yeah boy

Почему остаются данные после создания нового объекта?

Использую Tornado версии 5 и Python 3.6
Есть обработчик Tornado, выглядящий примерно так:
class Cb
class 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_answer
def __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() использовать =, однако хочется устранить проблему целиком.
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы