1. Python / Говнокод #8472

    −87

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    # bad, bad SQLAlchemy!        
        def assemble(self, message):
            mdict = message.__dict__.copy()
            self.__dict__.update(mdict)
            
        def disassemble(self, message):
            mdict = message.__dict__.copy()
            instance_state = self.__dict__.get('_sa_instance_state')
            self.__dict__.update(mdict)
            self.__dict__['_sa_instance_state'] = instance_state
        # /bad, bad SQLAlchemy!

    Вот что приходится делать, если надо привязать класс к нескольким таблицам в SQLAlchemy

    Запостил: Enchantner, 10 Ноября 2011

    Комментарии (6) RSS

    • А зачем copy() и локальная переменная? Разве нельзя просто self.__dict__.update(message.__dict__)?
      Ответить
      • Там были какие-то сложности с привязкой-отвязкой от сессии соединения. Уж не помню, чего я таким макаром избегал, но без корректного значения поля _sa_instance_state выпадала ошибка, мол, "объект уже привязан к сессии".
        Ответить
        • Это понятно. Непонятно то, что я спросил.
          Ответить
          • Ну глянь же внимательно, я это делаю, чтобы сохранить текущий статус объекта, а не перезаписать сессию другой сессией. При апдейте, если там будет это поле, оно перезапишется.
            Ответить
            • Ещё раз. Чем
              def assemble(self, message):
                      self.__dict__.update(message.__dict__)
                      
              def disassemble(self, message):
                      instance_state = self.__dict__.get('_sa_instance_state')
                      self.__dict__.update(message.__dict__)
                      self.__dict__['_sa_instance_state'] = instance_state

              отличается от того, что выше? Есть какие-то подводные камни?
              Ответить
              • Ничем, просто в прошлой версии кода я использовал del, что нежелательно на __dict__ живых объектов. Ваш вариант с экономией строки и чуточку памяти вполне подходит :)
                Ответить

    Добавить комментарий