Змея / Говнокод #27290 Ссылка на оригинал

0

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

ибааааать!

Запостил: Petro-san Petro-san, (Updated )

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

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

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

        алсо
        import pathlib
        pathlib.Path(filename).suffix == zip
        Ответить
        • Какое-то магическое выражение. К тому же, с высокой долей вероятности IsZIPFile превратится в IsArchive в будущем, так что этот код очен хорош своей расширяемостью, читаемостью и возможностями рефакторинга.
          Ответить
            • Да, мне тоже не понравилось.

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

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

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

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

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

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

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

          Вообще если тебя вольнуют первые 4 байта, то помоему лучше именно их и считать, а не readall
          Ответить
                • В питон завезли := он вроде может позволить одной строкой присвоить и использовать
                  Ответить
                • По YAGNI эта функция вообще нинужна. Рано или поздно ты пойдёшь читать что-то из этого zip'а, там либа всё и проверит. Если юзер какую-то хуйню залил -- ну ССЗБ, заново закинет правильный файл.

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

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

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

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

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

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

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

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

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

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

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

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

                            Писать одну и ту же логику два раза на двух языках это же уныло
                            Ответить
                    • Когда вы говорите, Иван Васильевич, такое ощущение, что вы бредите.
                      Ответить
                    • > ты переменную зачем завёл
                      > тогда ты нарушишь DRY

                      read(3) == b"PK♥"

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

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

                            В то время как одно можно вывести из другого просто на этапе компиляции.
                            Ответить
        • Ленивое IO в Haskell впало в немилость, кстати, ибо освобождение дескрипторов с ним тоже ленивое ^____~
          Ответить
          • Да и ошибки парсинга конфига получать через час работы сервака как-то не весело.
            Ответить
            • у вас последний день, зайдите в бухгалтерию за логами
              Ответить
      • Вроде можно не весь файл читать.
        Ответить
    • У вас файл утёк, кстати.

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

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

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8