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

    −146

    1. 1
    http://bugs.python.org/issue16203

    Меня всегда интересовало, зачем в питоне аж 3 функции поиска в регекспах re.search, re.match, который re.search("^"+regexp) и re.findall, который просто возващает список без всяких извратов (как в перле?). И вот я узнал, что этого гавна мало - в 3.4 добавили re.fullmatch, который re.search("^"+regexp+"$"). Нахуя так жить?

    Запостил: 3_14dar, 14 Июля 2015

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

    • Сёма, иди напитун, 3_14dar!
      Ответить
    • Понял, что питон говно? Похвально
      Ответить
    • > Нахуя так жить
      У любителя the only one way подгорело? re.match() и re.fullmatch() добавили для твоего удобства же, чтобы эти злоебучие крышки и баксы не приходилось лепить в регулярку и чтобы семантика операции была наглядней:
      # здесь надо вглядываться в закорючки
      if re.search("^#^*@^#*^*!@#^#//\\//\/\/\/\$"):
          # do something
      # а здесь сразу видно, что автор хотел проверить строку, а не искать в ней
      if re.fullmatch("#^*@^#*^*!@#^#//\\//\/\/\/\"):
          # do something

      P.S. Ты еще re.finditer() забыл упомянуть.
      Ответить
      • Больше всего поражает, что люди говорят "как так жить" когда существует дополнительная функциональность, а не отсутствует базовая. Как будто эти допфункции жрут ресурсы и время. Есть-пить не просят же
        Ответить
        • И при этом критикуют жабу и сишку за то, что в них нету кучи важных хелперов, и всё приходится велосипедить самому или качать либы...
          Ответить
          • И еще за убогий api, дай мне на жаве аналог requests.
            Ответить
            • https://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e49

              Сойдёт?
              Ответить
              • List<NameValuePair> formparams = new ArrayList<NameValuePair>();
                formparams.add(new BasicNameValuePair("param1", "value1"));
                formparams.add(new BasicNameValuePair("param2", "value2"));
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
                HttpPost httppost = new HttpPost("http://localhost/handler.do");
                httppost.setEntity(entity);

                Фубля.

                requests.post("http://localhost/handler.do", data={
                    "param1": "value1",
                    "param2": "value2",
                })


                SOSNOOLEY!
                Ответить
                • Ну всё лучше, чем в изкоробочном жабоговне. Там вообще всё ручками клеить.
                  Ответить
                  • В сортах не разбираюсь. Что значит ручками? socket.write('GET / HTTP/1.1')?
                    Ответить
                    • Не, чуть повыше уровнем. Чуть-чуть. Короче для поста все эти ёбаные key-value надо эскейпить и склеивать через & и =, а потом в стрим писать. А как изкоробочным клиентом отправляют файлы на сервер - лучше не спрашивай :)
                      Ответить
                      • Лал. Но есть же апачевский клиент.

                        Самая большая проблема http клиентов на жаве - нет опциональных аргументов или вменяемой эмуляции, нет литералов мэпа и списка (есть массив, но блядь, new String[] {'key', 'value'} выглядит уёбищно, да и проверки на 2 элемента нет).

                        Кстати, а как там в дотнете и с какой версии это доступно?
                        Ответить
              • Оставлю линк для не умеющих искать
                https://hc.apache.org/httpcomponents-client-ga/tutorial/html/fluent.html
                Ответить
                • В жопу себе засунь свой линк. Твой fluent распидорасит первый же автоформат. Да и читается он в 100 раз хуже чем с опциональными аргументами, хотя жаваёбы традиционно в глаза ебутся и один хер не знают, как выглядит нормальный код.

                  Request.Get("http://somehost/")
                          .connectTimeout(1000)
                          .socketTimeout(1000)
                          .execute().returnContent().asString();


                  Против
                  r=get("http://somehost/", timeout=1000)
                  r.body
                  Ответить
                  • Ого, как бомбануло
                    Ответить
                    • У меня даже люстру качнуло
                      Ответить
                    • Тебе показалось. Если бы я хотел найти апачевский клиент, я бы нашел. Бомбит тебе, что твой недоязык обосрали, знаю я вас, жавоебов. ЧСВ выше облаков, а именованных параметров нет, вот только недавно замыкания завезли.
                      Ответить
                      • Именованные параметры это сахар. Зачем они нужны когда можно объект передать ?
                        Ответить
                        • Уже писали, нужно или дописывать имя модуля, или делать import static
                          Ответить
                      • > Бомбит тебе
                        Лол, я ответил борманду, тебя в ответе никак не упомянул, но ты сам себя узнал и начал сразу советовать использовать анус для странных целей, как это, видимо, принято у 3_14dar-ов.

                        > твой недоязык обосрали

                        Лол, я на жабе практически не пишу. И уж тем более мне насрать, кто там что о нём говорит, язык и правда унылый.
                        Ответить
                        • Я не вижу, кто кому отвечает.

                          >как это, видимо, принято у 3_14dar-ов.
                          Нет. С чего ты взял? Выражение "засунь себе в жопу X" в отношении всякой хуйни употребляется довольно часто.

                          На чем же ты пишешь?
                          Ответить
              • Кстати, Пайк показал, что есть ещё один способ замутить именованные аргументы без поддержки языка.
                http://commandcenter.blogspot.nl/2014/01/self-referential-functions-and-design.html

                Добавив капельку воображения, можно и к жабе именованные аргументы прикрутить:
                // see http://pastebin.com/yBzHRgL6 for details
                
                Response r1 = get("http://www.google.com",
                                  timeout(5, TimeUnit.SECONDS),
                                  version(Version.HTTP_1_1));
                
                System.out.println(r1.body);
                
                Response r2 = post("http://govnokod.ru/posts",
                                   timeout(1000, TimeUnit.MILLISECONDS));
                
                System.out.println(r2.body);
                Ответить
                • А как объявлены timeout и version? Имплементируют какой-то интерфейс? Можно сказать,что годно, только готовой обертки в лучшей традиции жабки нет.
                  Ответить
                • Какое решение предлагаешь для get/post параметров? Параметры должны визуально быть объединены в группу как в питоне.
                  Ответить
                • Было еще {{}}, но жаваёбам не нравится.
                  Ответить
                • Ты начитил, паршивец. timeout у тебя в текущем классе лежать будет?
                  Ответить
                  • > import static
                    Ответить
                    • Не рекомендуется?
                      Ответить
                      • Ну всякие синусы можно поштучно надёргать, чтобы код с ними получше смотрелся. А в остальных 99% - нахуй. Как и using namespace в крестах или from foo import * в питоне.
                        Ответить
                        • Во всяческих DSL (вроде Mockito) import static весьма помогает. Дёргать действительно лучше штучно.
                          Ответить
                          • Все равно хуйня. timeout и co имею значение только в определенных вызовах -> они должны быть опциональными аргументами/методами, а не чем-то отвязанным. Вот почему вы, жаваебы, запороли {{}}?
                            Ответить
                • Но зачем, если писать придётся столько же, сколько во флюенте, только ',' вместо '.' и неймспейс засран.
                  Ответить
                  • И автокомплит, наверное, пострадает.

                    Кмк, единственный профит - не нужно дополнительного шага build() / execute(). Весь стейтмент воспринимается как одна операция, а не как цепочка волшебных манипуляций.
                    Ответить
        • Они засирают автодополнение. Так и до пхп недолго докатиться, с его "накатить регулярку и заэвалить результат" (регексп с e флагом)
          Ответить
          • > засирают
            О господи, да там в этом re десяток функций от силы. Чё там можно засрать? Ладно бы это была сишка с её одиноким глобальным неймспейсом...
            Ответить
            • Ну не знаю, я уже путал search с match. Ты-то путхоном один хер не пользуешься.
              Ответить
              • Да, пользуюсь всяко меньше тебя, но никогда их не путал...

                search - поиск
                match - спичка соответствие

                Учи английский, пригодится :)
                Ответить
                • Это даже не английский, а просто специфика профессии

                  Матчить, сёчить - уже довольно распространенные англицизмы
                  Ответить
                • >соответствие
                  Т.е. от начала до конца? Или как-то по-другому?

                  Неужели тяжелее выучить ^$, тем более что они во всех языках одинаковые?
                  Ответить
                  • > Т.е. от начала до конца?
                    Ну вот с этим они сфейлились, да. Надо было делать fullmatch изначально, а match выкинуть нахуй или обозвать startsWith (и до кучи добавить endsWith).
                    Ответить
                    • А может сделать как в перле и не ебать мозги?
                      Ответить
                      • В некоторых местах так и сделали (в пыхе, например). Передают в регулярку хуйню в духе "/^test$/iu". Вместе с флагами и совершенно бесполезными ограничителями, да. Зато как в пёрле, да.
                        Ответить
                        • Ограничители - хуйня (хотя с ними можно запилить подсветку!), флаги заменить константами, а остальное - норм.
                          Ответить
      • >У любителя the only one way подгорело?
        Да. Спасибо что подсказал.

        >добавили для твоего удобства же, чтобы эти злоебучие крышки и баксы не приходилось лепить в регулярку и чтобы семантика операции была наглядней:
        Для этого надо или синтаксис регулярок подсвечивать, или еще что-то делать, а не хуйней страдать. Где не спрашивал - никто не мог внятно ответить, на кой хуй нужно search и match, наверно, чтобы путать новичков и тех, кто мало этим пользуется.

        Для себя я захуячил такой костылик:

        re.format("%s.*%s", str1, str2)

        Все что в %s эскейпится. Теперь про паразита пиздеть не будешь, хуесос?

        >Ты еще re.finditer() забыл упомянуть.
        Тут хоть понятно, это клон findall с итератором вместо списка? Угадал?
        Ответить
    • Вот же ты наркоман ебучий, а

      http://govnokod.ru/18407
      Ответить

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