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

    −118

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    from os import walk
    from time import time
    
    from abc import ABCMeta, abstractmethod
    
    class Reporter(object):
        __metaclass__=ABCMeta
        
        @abstractmethod
        def report(self, catalogs_cntr, files_ctnr, speed):
            """ output catalogs_cntr, files_ctnr, speed to somewhere """
            #pass
        
    class ConsoleIndicator(Reporter):
        def __init__(self, out_splitter):
            self.__out_splitter=out_splitter
            
        def report(self, catalogs_cntr, files_ctnr, speed):
            if self.__out_splitter and self.__out_splitter.pipes:
                _result = "\rcataloges:" + repr(catalogs_cntr).rjust(8) 
                _result += "\tfiles:" + repr(files_ctnr).rjust(13) 
                _result += "\tspeed: %12.3f"%speed + " files/s"
                
                self.__out_splitter.write(_result)
                self.__out_splitter.flush()        
                    
    class CatalogsWalker(object):
        """ """
        
        def __init__(self, catalogs, reporter=None):
            """ """
            
            self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
            self.__reporter = reporter 
            self.__catalogs = catalogs if hasattr(catalogs, "__iter__") else [catalogs]
    
            
        def __iter__(self):
            self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
            self.__start_time=time()
            for catalog in self.__catalogs:
                print catalog
                for p,d,ns in walk(catalog): 
                    _ = d;
                    self.__catalogs_cntr+=1
                    for n in ns:
                        self.__files_cntr+=1
                        self.__speed=self.__files_cntr/(time()-self.__start_time)
                        if self.__reporter:
                            self.__reporter.report(self.__catalogs_cntr, self.__files_cntr, self.__speed)
                        yield p,n
                        
        @property
        def reporter(self):
            return self.__reporter
        
        @property
        def catalog_counter(self):
            return self.__catalogs_cntr    
        
        @property
        def file_counter(self):
            return self.__files_cntr
        
        @property
        def start_time(self):
            return self.__start_time
        
        @property
        def speed(self):
            return self.__speed

    По мотивам http://govnokod.ru/17181 Учтены замечания некого Анонимус http://govnokod.ru/17181#comment256577. Надеюсь что будут еще замечания, такие же конструктивные и полезные.

    Запостил: apgurman, 08 Декабря 2014

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

    • Здравствуйте, ваша поостыня очень важна для нас. Вас проконсультирует первый освободившийся аналитик. Спасибо за интерес проявленный к нашему проекту.
      Ответить
      • Ты не Ёрничай. Эта проостыня всего 70, строк считая пустые.
        Ответить
        • Вы ведь понимаете, что не в школе повышения квалификации находитесь, правда?
          Ответить
          • Я нахожусь на форуме, где люди по идее должны обсуждаться проблемы связанные с написанием хорошего кода. Конечная цель этого обсуждения, в общем-то и есть, повышение квалификации друг друга. Обмен опытом, так сказать. А такие высокомерные и не факт, что высококвалифицированные, г****ки, как вы пытаются здесь утвердить загнобленное в обычной жизни "я". Скромнее нужно быть молодой человек.
            Ответить
            • Смотрите, вот сверху написано: Нашли или выдавили из себя код <...> запостите его на говнокод.ру, посмеёмся вместе!

              Зачем Вы место, где программисты собираются у костра для разговоров по душам, в мастерскую идеального кода превращаете? Начните уже развлекаться, что Вы серьёзный-то такой!
              Ответить
              • Если бы эти два ковнокодовца были бы столь же дружелюбны как Вы, я бы тоже вместе с ними посмеялся над своим говнокодом. Я не всегда серьезный И тоже люблю смеяться))
                Ответить
                • Не спорь с ними - ты им ничего не докажешь, а эмоции оставь там, за экраном. Если тебе что-то не нравится - тупо забей болт на этого человека и игнорируй его. Иногда достойнее молча въебать минус за глупый пост, чем поддаться на провокацию. Они это оценят. При всём при этом я полностью солидарен с тобой, здесь немало неадекватных людей, из категории "мамка шесть раз подкинула - два поймала"; в своё время я был вынужден покинуть сайт, потому, что противостояния с ними ни к чему не привели, я только настроил против себя остальных. Не повторяй моих ошибок.
                  Ответить
                  • Стретор?Ну а чо, он вполне дельно говорит.
                    Ответить
                    • На хуй иди.
                      Это я. Как дела, как поживаешь?
                      Ответить
                      • Съешь еще этих сочных камерунских хуйцов.
                        Привет, Стертор. Давно не заходил к нам на огонёк.
                        Ответить
                        • Покорнейше благодарю. Не разделяю Ваших гастрономических интересов.
                          ровно через 3 года зарегаю учётку. если не умру и не женюсь.
                          Ответить
                          • Хватит плюсовать, ханжи.
                            Ответить
                            • Только не плюсуйте теперь этот тред целиком. Пожалуйста.
                              P.S. Заходите к нам почаще. Место около костра с видом на речку всё ещё пустует.
                              Ответить
                  • Да мне п*х что они здесь не по делу пишут. А вот те полтора человека чуть помогли Т.е 0 + 1,5 = +1,5 все же польза))
                    Ответить
                  • Конечно на stackexchange.com много больше пользы. Но с паршивой овцы, как говорят, хоть шерсти клок.
                    Ответить
            • >Я нахожусь на форуме, где люди по идее должны обсуждаться проблемы связанные с написанием хорошего кода.
              это в иной реальности. В именно этой реальности на ГК обсуждается все то, что интересно в данный момент.
              Беседы на кухне отличная метафора. Так вот на кухне ни кто не будет тебя учить как надо. Ибо таких дел на работе достаточно. На хера еще своё личное время на это тратить.
              Ответить
              • > На хера
                Нахера.
                Ответить
              • показать все, что скрытоТы за всех не отвечай. Здесь полно людей, которым интересно обсуждать мой код. Не нравится, не трать свое личное время на то, чтобы писать то, что ты написал. В чем смысл твоего послания?
                Ответить
                • пожарный гидрант там ==>
                  Ответить
                • >Здесь полно людей, которым интересно обсуждать мой код
                  1,5
                  Ответить
                  • Учитывая, что здесь их всего 3.5, то не так уж и мало.
                    Ответить
    • > cataloges, catalogs
      directories или folders блджад.

      > self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
      Прекрати экономить строки, содомит.

      Насчет out_splitter'а: проверкой self.__out_splitter.pipes ты завязался на то, что там должен быть именно OutputSplitter. А нафига, если по смыслу тут любой поток с write и flush подходит?
      Ответить
      • > А нафига, если по смыслу тут любой поток с write и flush подходит?
        Там все сложнее)) __out_splitter.pipes список pip(ов) и он может эти pipes и не иметь вовсе. Т.е. просто ничего не нужно выводить. А если ничего не нужно выводить, то нафига сложные манипуляции с _result строкой производить? да еще и пытаться это в никуда выводить?
        Ответить
        • Зачем кому-то передавать туда пустой сплиттер? В конце-концов если он именно это и хотел - передал бы reporter=None. Преждевременная оптимизация, имхо.
          Ответить
          • Анекдот есть про программиста и про пустой и полный стакан на тумбочке перед сном. Знаешь?
            Ответить
          • Зачем кому-то передавать туда пустой сплиттер?
            Может ему будет удобнее сплиттер в виде пустого списка держать Зачем мне об этом думать? Моя задача перестраховаться в этом месте
            Ответить
            • > Зачем мне об этом думать?
              Вот именно. Дёргал бы write в любом случае да и всё. Бутылочным горлышком эти сложения строк не должны стать.

              P.S. Или ты погонял код под профайлером и выяснил, что при отправке в пустой OutputSplitter именно эта функция просаживает производительность?
              Ответить
              • Да ты сам погоняй в профайлере вот это
                _result = "\rcataloges:" + repr(catalogs_cntr).rjust(8) 
                            _result += "\tfiles:" + repr(files_ctnr).rjust(13) 
                            _result += "\tspeed: %12.3f"%speed + " files/s"
                            
                            self.__out_splitter.write(_result)
                            self.__out_splitter.flush()
                Ответить
              • Мне кажется это займет больше чем все что он делает остального ну если он конечно не на тейп 70х годов выводить будет
                Ответить
                • > все что он делает остального
                  Да ну... Ты же эти файлы скорее всего читать будешь, или в субд куда-нибудь вносить, в текстовый файлик писать, в конце-концов... Это же всё явно не ради подсчета файлов пилилось?

                  Имхо, лучше сделать троттлинг отчета - писать отчет в сплиттер не чаще раза в секунду, к примеру. От этого производительности будет явно больше, чем от проверки на пустой pipes. Да и юзеру приятней будет смотреть.

                  P.S. Под виндой терминал лагает как говно. Там именно он и будет bottleneck'ом. В линухе чуть лучше, но тоже запросто может упереться именно в него (сейчас затестим).
                  Ответить
                  • Я не хочу думать кто куда там будет что выводить. А вдруг в буфер памяти с помощью strcpy или еще быстрее? Я там тебя про анекдот спрашивал Слышал?
                    Ответить
                    • Напишут свой Reporter на крайний случай, если совсем уж прижмёт. Благо интерфейс ты предусмотрел.

                      А про троттлинг, кстати, подумай. С ним вывод намного приятней смотрится - не бесконечно бегущий поток символов, а аккуратный отчетик каждую секунду (можно и реже, я обычно на 5-10 настраиваю). Бесплатная плюшка - форматирование строки раз в секунду вообще не напрягает, и можно забить на self.__out_splitter.pipes и прочие оптимизации.

                      > Слышал?
                      Ну.
                      Ответить
                      • Я обязательно познакомлюсь с троттлинг. Хотя уверен, что бесплатным бывает только сыр в мышеловке)).

                        Обычный человек, когда ложится спать, ставит на тумбочку стакан с водой на случай если он захочет пить. Программист ставит стакан с водой на случай если он захочет пить и пустой стакан на случай если он не захочет пить.

                        Надеюсь ты видишь связь этого "анекдота" c нашей дискуссией про pipes
                        Ответить
                  • Кстати, выведите на stdout файл с дохрена символами звонка и охренейте.
                    Ответить
                    • Для усиления эффекта можно зайти куда-нибудь через RDP и сделать это на удалённой машине. У меня вообще комп к хуям вис ;)
                      Ответить
                      • На который зашел или с которого?
                        Ответить
                        • С которого. Но я там не звонки слал, а просто большой файлик случайно высрал в stdout.
                          Ответить
                          • Лоол.
                            >Но я там не звонки слал, а просто большой файлик случайно высрал в stdout.
                            Я - то же самое. Комп не вис, но висли **все** консоли.
                            Ответить
      • >блджад Это что?
        Ответить
      • > Прекрати экономить строки, содомит
        Это я у вас учусь
        Ответить
    • > "\tspeed: %12.3f"%speed + " files/s"
      Форматируешь тоже через жопу:
      "\tspeed: %12.3f files/s" % speed
      И не экономь пробелы вокруг операторов, нечитабельно же (читай PEP-8, если мне не веришь).
      Ответить
      • Тут я подумаю. Может ты и прав)) В любом случае cпасибо. Хотя тут наверно слово "спасибо" не в моде))
        Ответить
      • А нет какой-нибудь кнопки "оформить все правильно" в IDE, как автоформат в эклипсе?
        Ответить
    • Шта? Говнокодик превращается в стековервлоу?
      Ответить
      • Вот что бывает, когда сиськи не показывают.
        Ответить
      • Лен, очевидно плохого и интересного кода малр. На гк уже произошло насыщение. Так что, направлений всего два: СО и вайп.
        Ответить

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