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

    0

    1. 1
    2. 2
    def IsZIPFile(filename):
        return filename.lower().endswith('.zip')

    ибааааать!

    Запостил: Petro-san, 10 Марта 2021

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

    • поразительно хуёвая функция, и одновременно с этим соврешенно ненужная. Единство формы и содержания!
      Ответить
      • Что в ней хуёвого? И что в ней ненужного? Как бы ты это сделал? Будет ли решение на рагулярках хорошим?
        Ответить
        • хуевый в ней кодстайл

          я бы просто написал
          filename.lower().endswith('.zip')

          алсо
          import pathlib
          pathlib.Path(filename).suffix == zip
          Ответить
          • Какое-то магическое выражение. К тому же, с высокой долей вероятности IsZIPFile превратится в IsArchive в будущем, так что этот код очен хорош своей расширяемостью, читаемостью и возможностями рефакторинга.
            Ответить
            • >IsArchive
              https://www.python.org/dev/peps/pep-0008/#function-and-variable-names
              Ответить
              • Да, мне тоже не понравилось.

                Ну вдруг это код каких-нибудь сишников, и у них в компании свой кодстайл.

                Лично я вот так пишу: variable_name, functionName, ClassName, и мне нормально .
                Ответить
                • >functionName
                  фу, нахуя нарушать конвенции?

                  Всё таки питух реднкая вербозня, нахуя вот тут две строчки?
                  Ответить
                  • > фу, нахуя нарушать конвенции?

                    https://youtu.be/HGutEFXo9os

                    > Всё таки питух реднкая вербозня, нахуя вот тут две строчки?

                    Напиши на одной, мне не жалко. Потом придётся переделывать это, заебёшься искать по коду такие конструкции.

                    В данном конкретном случае в любом ЯП можно это обернуть в функцию, чтобы выглядело пижже. И не такой уж это и вербознух.
                    Ответить
                    • мочи манту, шатай систему

                      В нормальном языке даже эту функцию можно написать в одну строку.
                      И не надо filename делать строкой, кстати. Будешь потом слешики неправильные выкавыривать.

                      //Одна строка, внятная семантика, никакого lower
                      // и никаких дурацких скобочек при использовании
                      val File.isZip get() = extension.equals("zip", ignoreCase = true)
                      
                      
                      fun main() {
                          println(File("/home/rms/gpl.txt").isZip) //false
                          println(File("/home/rms/cp.zip").isZip) //true
                      }
                      Ответить
                      • Что ты будешь делать когда обезьяны закончатся?
                        Ответить
                        • У меня циклический буфер. Начну с начала
                          Ответить
                • > Лично я вот так пишу

                  Да там половина стандартной либы с нарушением PEP8 написана...
                  Ответить
            • > превратится в IsArchive в будущем

              в IsBukva
              Ответить
            • .3un
              Ответить
        • https://govnokod.ru/23672
          Ответить
          • это же низкий уровень

            Джордейна все помнят?
            Ответить
            • ебать ты олд :))

              мне казалось, что только я ту книжку сюда приносил
              Ответить
    • Говнокод в определении типа файла по расширению, а не по содержимому.
      def IsZIPFile(filename):
          return open(filename, "rb").readall().startsswith(b'PK♥')
      Ответить
      • > PK♥
        Ответить
      • > по содержимому

        А вдруг это docx или сейв от какой-нибудь игрушки?
        Ответить
        • А нам не пофиг? Если нужно, чтобы следующий юзер скачал и у него всё открылось как надо, придётся
          и расширение проверять. А если нужно чисто для нас, то пофиг на расширение, главное чтобы открывалось, дальше разберёмся.

          Паттерн "переименованый zip" — лидер на рынке хранения ресурсов.
          Ответить
          • Kitty.scr.exe
            Telki.mp4.exe
            Windows10.iso.exe
            и даже
            Windows10.torrent.exe
            Ответить
            • На сервере пофиг, там не двойным кликом открывают. Проверяем магические байты, если хотим, дальше скармливаем unzip.
              Ответить
              • а вдруг мы вообще не храним это на сервере в виде файла?
                вдруг мы ебанутые, и храним это в базе, как BLOB, а расширение (вместе с контент диспозишином) приделываем сами, когда отдаем данные?
                Ответить
            • > .scr.exe
              помножил на 0
              Ответить
              • чойто?
                Ответить
                • scr этож и есть exe с аргументами --help, --version и --fullscreen
                  Ответить
                  • Поскольку трояны и вирусы, установленные с использованием файлов SCR, трудно обнаружить и удалить, не рекомендуется открывать неизвестные файлы SCR, найденные на жестком диске.

                    Как часто вы находите неизвестные файлы на жёстком диске? Кто их вам подкладывает?
                    Ответить
                    • поработай с емаксом

                      офигеешь от всех этих ~1~
                      Ответить
                    • а ты типа знаешь все файлы у себя в system32?
                      Ответить
                    • все правильно же написано, беспроигрышный вероянт для мольваре - винда рано или позно сама найдет цє:/шиндоушс/*.src и запустит с клютчем --preview
                      Ответить
                  • не знал) доберусь до виндокомпа, посмотрю заголовки
                    Ответить
                  • Ты совершенно прав.

                    Проверил .scr файл. Заголовок MZ. Заглянул через Impex плагин в фаре, вижу обычное 64битное приложение. В секции IMPORTS вижу .dllки. В ресурсах вижу картинки.
                    Ответить
                    • Ну было бы странно новый формат изобретать для скринсейверов.
                      Ответить
                      • Интересно, а как это работает у иксов?
                        Там вроде был экстешнен для скринсейверов, нужно почитать
                        Ответить
                        • Да тоже поди обычная прога.
                          Ответить
                          • какой секурити ))

                            зы: да, программа, общающаяся с сервером через тот самый экстиешншен
                            http://manpages.ubuntu.com/manpages/bionic/man3/Xss.3.html
                            Ответить
      • Против трапов тоже хорошо работает
        Ответить
        • Проблема в том, что ты его уже открыл и прочитал полностью.
          Ответить
          • что упало у студента, то упало на газету
            Ответить
      • Лучше всего попытаться прочитать заголовки соответствующей либой, ну или доверять пользователю и обламываться на открытии, если что

        Руками байтики читать, ещё из Пистона, это сорт пиздеца
        Ответить
        • libmagic, кстати, в питон завезли. Так что читать байтики ручками это вдвойне пиздец.
          Ответить
          • любопытно, как этот магик проверяет сигнатурки, там же хитро и не все соблюдают спеку
            Ответить
            • лолушки, file и даже trid объебались на моих файлах
              даже несмотря на то что я "зип" вытащил из внешнего котейнера
              Ответить
      • >readall
        а там 4 гб
        Ответить
        • Именно поэтому я за хаски с его ленивыми списками. Питон тоже мог бы вернуть ленивый итератор, в принципе.
          Ответить
          • а неужели нельзя в пиздоне делать read() пока EOF не придет? неужто нужно сразу всё в память?

            Вообще если тебя вольнуют первые 4 байта, то помоему лучше именно их и считать, а не readall
            Ответить
            • Можно read(3), но некрасиво же, магическое число.
              Ответить
              • prefix = b'pkz'
                read(len(prefix)) == prefix
                Ответить
                • Уже 2 строчки получится.
                  Ответить
                  • В питон завезли := он вроде может позволить одной строкой присвоить и использовать
                    Ответить
                • YAGNI rate is low
                  Ответить
                  • По YAGNI эта функция вообще нинужна. Рано или поздно ты пойдёшь читать что-то из этого zip'а, там либа всё и проверит. Если юзер какую-то хуйню залил -- ну ССЗБ, заново закинет правильный файл.

                    Так же, как и с проверкой мыла: собачка есть и ладно.
                    Ответить
                    • Особенно круто, если эта функция на клиенте, а открывать мы будем на серваке после аплоада.

                      Но доктор сказал в морг, значит, в морг
                      Ответить
                      • Угу, на клиенте вообще достаточно фильтра по zip в окошке выбора файлов.

                        Именно поэтому я за "YAGNI".
                        Ответить
                  • да, YAGNI запрещает читать не целиком, я забыл
                    Ответить
                    • а голову ты дома не забыл?

                      ты переменную зачем завёл, изверг? она тебе не нужна.

                      напиши два раза строковый литерал.

                      правда... тогда ты нарушишь DRY! сложно быть читателем википедии.

                      но виноваты конечно авторы питоньячьей либы, сложно было что ли зафигачить метод readAndCheck(str)??
                      Ответить
                      • Кстати, даже на Википедии написано, что Dry может соснуть в веб-программировании, потому что иногда имеет смысл вылидировать форму на клиенте, а потом на сервере, чтобы сервер лишний раз не нагружать хуитой.

                        Ты в этом случае за «веб-програмиирование» или «DRY»?
                        Ответить
                        • ой ну это сложный вопрос

                          тут нужна экспертиза Соломона Самсоновича и Африкана Свиридовича
                          Ответить
                        • DRY соснет только если ты два раза напишешь одну и ту же логику валидации.

                          Если же твой фреймворк позволяет написать её один раз, и запустить на беке и на фронте, то DRY не нарушен.
                          Ответить
                          • Т.е. если у меня фреймворк не позволяет один раз написать логику валидации формы, а потом её вставить на сервер и перевести на JS на клиенте, то фреймворк заведомо куриный?
                            Ответить
                            • Ну я считаю, что хороший фреймворк должен такое позволять.
                              Хотя бы на уровне HTMLя расставлять type и pattern.

                              Валидировать на сервере нужно всегда, это вопрос безопасности
                              Валидировать на клиенте очень желательно: это вопрос удобства

                              Можно отсылвать всё на сервер, и валидировать там.
                              Но если фреймворк может логику валидации запустить и на сервере, и на клиенте, причем из одного и того же сурса, то это вообще классно.

                              Писать одну и ту же логику два раза на двух языках это же уныло
                              Ответить
                              • Да, это так. В питоне, кстати, есть вот такая красота:

                                https://pypi.org/project/WTForms-ParsleyJS/

                                Но это для WTForms из фласка. Не знаю, есть ли такая скилльная штука в джанге...
                                Ответить
                            • Какой «Идеальный код» МАКАКоннелла )))
                              Ответить
                      • Когда вы говорите, Иван Васильевич, такое ощущение, что вы бредите.
                        Ответить
                      • > ты переменную зачем завёл
                        > тогда ты нарушишь DRY

                        read(3) == b"PK♥"

                        И YAGNI живы и DRY цел.
                        Ответить
                        • DRY не цел, бо 3 это повторение PK♥
                          Ответить
                          • Где ты повторение увидел? Три это три, PK♥ это PK♥. Это разные сущности, у них даже тип разный.
                            Ответить
                            • 3 зависит от PK♥
                              Изменение одного должно приводить к изменению второго.
                              Если одно поменять, а про другое забыть -- будет неконсистентно.

                              Это главная проблма не DRY кода: ты в одном месте поменял, а в другом забыл.

                              В то время как одно можно вывести из другого просто на этапе компиляции.
                              Ответить
                              • Ну ок.

                                read(1000).startswith("PK♥")
                                Ответить
                                • Плохо поддерживает файлы размером менее 1000 байт вроде, а еще magic number
                                  Ответить
                                  • Да нет, для коротких файлов просто вернёт кусок, как в сишке.

                                    Ок, убрал магические числа: read(math.exp(math.pi)).startswith("PK♥" )
                                    Ответить
                                    • здесь понадобится документация, так как не очень понятно, причем тут pi
                                      Ответить
                                      • """
                                        «pi» говорит цыплёнок.
                                        """
                                        Ответить
                                        • /** Performs computation and returns the result, or throws some exception. */
                                          Ответить
                                          • Это документация к методу Do()?
                                            Ответить
                                            • ну да, там еще такие методы есть
                                              /**
                                              * sets id
                                              */
                                              void setId(int id);
                                              
                                              /**
                                              * sets name
                                              */
                                              void setName(String name);
                                              Ответить
                                              • Кстати, о борьбе с копипастой
                                                NUM_OF_NA_SYLLABLES = 2
                                                NA_SYLLABLE = "NA"
                                                BA_SYLLABLE = "BA"
                                                
                                                banana = BA_SYLLABLE + NA_SYLLABLE * NUM_OF_NA_SYLLABLES
                                                print(banana)
                                                Ответить
                                            • https://developer.apple.com/documentation/foundation/nsoperation/1416837-start
                                              Ответить
                                          • Забыл добавить «if compiled with O1 level at most».
                                            Ответить
          • а я за mmap()
            Ответить
            • А там 4 гигабайта и 32-битная ось.
              Ответить
              • маппить разные куски файла можно
                https://man7.org/linux/man-pages/man2/mmap.2.html
                The contents of a file mapping (as opposed to an anonymous
                mapping; see MAP_ANONYMOUS below), are initialized using length
                bytes starting at offset offset in the file (or other object)
                referred to by the file descriptor fd.  offset must be a multiple
                of the page size as returned by sysconf(_SC_PAGE_SIZE).
                Ответить
                • Ну это уже не так прозрачно. Придётся как-то переключать маппинги на границе.
                  Ответить
              • Кстати на x86-64 там далеко не всё адресное пространство работает:
                https://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details
                Ответить
                • Да, но это же просто деталь реализации нынешних процов. В будущем разработают, добавив новый уровень в пейджтейбл.
                  Ответить
          • Ленивое IO в Haskell впало в немилость, кстати, ибо освобождение дескрипторов с ним тоже ленивое ^____~
            Ответить
            • Да и ошибки парсинга конфига получать через час работы сервака как-то не весело.
              Ответить
              • у вас последний день, зайдите в бухгалтерию за логами
                Ответить
        • Какой багор
          Ответить
        • Вроде можно не весь файл читать.
          Ответить
      • У вас файл утёк, кстати.

        Какой высокоуровневый язык с автоматическим управлением памятью )))
        Ответить
        • автоматический от автоматическое оружие

          выстрелил и забыл
          Ответить
      • А ежели тама SFX?
        Ответить
        • А SFX это .exe внутри? Там должно начинаться с MZ? Миша Збыковски, или как там его
          Ответить
          • Сам архив же не обязательно в начале фала.
            Ответить
            • Вообще zip надо тестить с конца файла, а не с начала. Главный хедер у него в конце.
              Ответить
              • как работает "file" ?
                Ответить
                • file tsyplyonka broilera
                  Ответить
                  • короче, если в "басх" набрать например "филе а.оут" , то выводится типа "ЕЛФ"

                    Генерал Файлюра читал мой диск, и нашел там еггог
                    Ответить
                • Как анскилльная лалка, по началу (по хедеру первого файла). Я нулей туда хуйнул, перестал определять. А unzip'у норм.
                  Ответить
                  • jpeg туда лучше хуйни. Не потеряется функциональность ни изображения, ни архива.
                    Ответить
                  • > Я нулей туда хуйнул

                    - стильное радио
                    Ответить
      • > startsswith(b'PK♥')
        этож не меньшее говно
        3un, ебнип, надо сканить с конца файла ради сигнатурки
        Ответить

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