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

    −355.7

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    for item in self.__dict__.keys():
                if item[:3] == 'on_' or \
                   item[:16] == 'set_handler_for_' or \
                   item[:6] == 'do_on_'\
                :
                    del self.__dict__[item]

    Запостил: guest, 07 Августа 2009

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

    • cheef:
      это наверное после php..
      Ответить
    • Главное - не ошибиться с длиной подстроки :)
      for item in self.__dict__.keys(): #".keys()" можно опустить
                  if item.startswith('on_') or \
                     item.startswith('set_handler_for_') or \
                     item.startswith('do_on_') \
                  :
                      del self.__dict__[item]

      или
      test = [item for item in self.__dict__ if item.startswith('on_') or \
                     item.startswith('set_handler_for_') or \
                     item.startswith('do_on_') ]

      Или есть более кошерные варианты?
      Ответить
      • Пардон, погорячился: второй вариант не катит - работаем со словарём, а у меня городиться список.
        Ответить
        • test = not not [item for item in self.__dict__ if item.startswith('on_') or \
                         item.startswith('set_handler_for_') or \
                         item.startswith('do_on_') ]


          и будет bool
          Ответить
      • Можно немного сократить код, воспользовавшись list comprehension и встроенной функцией any.
        for item in self.__dict__.keys():
                    if any(( item.startswith(prefix) for prefix in ('on_', 'set_handler_for_', 'do_on_') )):
                        del self.__dict__[item]

        К сожалению, этот вариант работает примерно в 2 раза медленнее :)

        При помощи регулярных выражений можно сократить код и немного повысить быстродействие.
        import re
        pattern = re.compile('on_|set_handler_for_|do_on_') # важно сохранить ссылку на паттерн, иначе скорость опять упадёт в два раза
        for item in self.__dict__.keys():
                    if pattern.match(item):
                        del self.__dict__[item]

        Этот способ примерно на 25% быстрее варианта с startswith.

        Ещё рекомендую вместо
        del self.__dict__[item]
        писать
        delattr(self, item)
        , а вместо
        self.__dict__
        писать
        vars(self)[item]
        Ответить

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