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

    −100

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    #Было
    def extract_brand(x):
                    x = x[0].lower()
                    for brand in brands:
                        if x.count(brand):
                            return brand
    il.brand_out = extract_brand
    
    #Стало после кодревью
    il.brand_in = lambda x: [brand for brand in brands if brand.lower() in x[0].lower()]

    Кто то смог прочитать второй вариант?

    Запостил: kyzi007, 22 Июня 2014

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

    • был один .lower(), стало два. кто выиграл?
      Ответить
      • Два, походу, из-за того, что сама табличка брендов не в нижнем регистре.

        Жопа в другом - теперь lower считают на каждой итерации. Мой внутренний байтоёб негодует.
        Ответить
        • Мой байтоеб с твоим солидарен. И поэтому до этой красоты я приводила к нижнему регистру бренды при выкусывании их, потому что бренд ищется не для одного элемента а 25.
          Ответить
        • Зато красиво!
          Ответить
    • [масло для масла из масел где масляное]

      Код, кстати, не эквивалентный - оригинал возвращает первый найденный бренд, а вторая версия - все найденные.
      Ответить
      • Код эквивалентен потому что в out процессоре все равно возмется первое значение.
        Но в моем случае оно дальше искать не будет и вообще лишних телодвижений в разы меньше. Но это не важно, я тупо не могу прочитать результат.
        Ответить
        • > я тупо не могу прочитать результат
          [brand for brand in brands if brand.lower() in x[0].lower()]
          Вернуть brand для каждого brand из brands такого, что brand.lower() содержится в x[0].lower().
          Ответить
          • теперь по-сложнее
            return [{'value': t} for prop, table in M[tag] for t in set([obj[prop] for obj in table.objects()])]
            Ответить
            • Для каждого свойства prop и таблицы table, перечисленных в M[tag], найти различные значения свойства prop в объектах таблицы table и вернуть эти значения в виде списка объектов вида {'value': значение}.

              Как-то так?
              Ответить
              • Да. Все верно.
                PS. вот таким макаром в проекте создается автодополнение значений из базы данных.
                Ответить
                • Но т.к., в отличие от LINQ, питон не умеет превращать comprehensions в запросы, этот код выкачает через ORM все поля всех объектов каждой из перечисленных в M[tag] таблиц, пробежится по ним, и выберет различные значения свойства...

                  Оно не слишком медленное?
                  Ответить
                  • В Джанго есть QuerySet.defer(), но я хз. в моем представлении ОРМ это механизм облегчить работу тем, кто не может (всилу незнания) написать хороший запрос самостоятельно. А извращаться с оптимизацией запросов сделанных через генераторы запросов, это примерно как держать чопстики чопстиками и пытаться так есть.
                    Ответить
                    • > В Джанго есть QuerySet.defer()
                      Но этот код никакие отложенные запросы не спасут, т.к. objects() + for явно пробегут по всем записям в таблице, а obj[prop] с неизвестным на время исполнения запроса prop заставит ОРМ выбрать все подряд поля...

                      При этом тот же LINQ, емнип, превратил бы этот запрос в че-то типа 'select distinct prop from table' в цикле по (prop, table). И база смогла бы воспользоваться index scan'ом вместо full table scan'а и т.п. Ну и трафик между СУБД и прогой на порядки бы упал.
                      Ответить
                      • Ну тут вообще плохо... set(... some query ...) - это уже херово, т.как намекает на то, что в запросе не было distinct.
                        Ответить
                    • а по-моему ORM - это как раз для тех, кто заебался писать в очередном проекте очередной раз select somefield from anytable where somefield=:someparam и хочет делать просто:
                      var customer_name = Customer->findById(id);
                      Вопрос в том, что ORM тоже бывают не идеальны и запилить прямой запрос окажется в разы дешевле чем "сделать красиво", но тогда твой код окажется здесь.
                      Ответить
                      • > ORM - это как раз для тех, кто заебался писать в очередном проекте очередной раз select somefield from anytable where
                        Ну и для тех, кто заебался писать where foo like 'bar%' and baz = 42, когда эти условия убираются/добавляются динамически... Вот тут орм реально выруливает за счет композиции условий. Ну и insert/update конкретной записи намного проще делать. В общем большую часть рутины для формошлепства ORM запросто снимает.
                        Ответить
                      • При чем здесь ОРМ? ОРМ - это привязка таблиц к объектам. Никто не мешает написать, например, функцию select в своем коде не привязывая ее к каким-то классам, единственная функция которых продублировать структуры базы данных. Даже самый примитивный ПХП дата обжектс уже убирает необходимость написания тривиальных запросов, не заставляя создавать всякие ДАО и традицонно полагающуюся к ОРМ кучу бойлерплейта.
                        Ответить
                        • сравни ORM в Yii (PHP) и ASP.NET MVC(сисярп). С Yii я мог в контроллере создать 100500 моделей или просто переменных и передать их во вьюху. Из той же вьюхи я мог спокойно обращаться к моделям (да, это не тру, но иногда приходилось делать так). В ASP.NET MVC мне приходилось на каждый чих писать linq-запрос и к нему городить отдельный класс (даже если нужно было сделать обычный dropdownlist но с особыми условиями выборки). Особо меня добивает то, что в ASP.NET MVC на одно действие надо лепить джве процедуры. Одна будет срабатывать если это был POST-запрос, вторая будет срабатывать чтобы сгенерировать тупо webgrid. и на каждый чих свою вьюху. В partialView эта херня умеет как-то неправильно, но может я чего-то не знаю.
                          Так что ОРМ очень даже при чем. Особенно если ее писали люди с ынтерпрайзом головного мозга.
                          Ответить
                        • Неистово плюсую
                          Ответить
                  • Вот именно поэтому все это обернуто в кэширующий декоратор. В моем случае база - монга. linq может в нее? (на шарпе ни строчки не написал)
                    Ответить
                    • > linq может в нее?
                      А хрен знает, я на нем тоже не писал.

                      Ну а в теории монга должна же выполнить select distinct prop from table (или как там это пишется на ее языке) быстрее, чем прокачать всю таблицу да выпилить дубликаты на стороне питона?
                      Ответить
                      • да. проверил 0.02 sec против 1.33 sec при ~2000 документов в коллекции.
                        return [{'value': t} for prop, table in M[tag] for t in table.objects.distinct(prop)]
                        Ответить
    • brand for brand in brands if brand
      Почти стихи
      Ответить
    • List comprehensions лучше разрывать перед каждым ключевым словом:
      il.brand_in = lambda x: [brand 
                               for brand 
                               in brands 
                               if brand.lower() in x[0].lower()]
      Ответить
      • pep с вами не согласен
        Ответить
        • Согласно ПЕП'у надо писать эти штуки в одну строку?
          Ответить
          • хмм.. странно. думал что чекер должен кинуть ворнинг. перепроверил - говорит, что все нормально. Но если уж хочется переносов, то я бы писал в 3 строки
            il.brand_in = lambda x: [brand 
                                     for brand in brands 
                                     if brand.lower() in x[0].lower()]
            Ответить
    • Ну первый вариант тоже не сахар. Нахрен искать все вхождения через count() если нужно удостовериться в присутствии хотя бы одного?

      А второй еще ничего так, обычный list comprehension с не особо сложным условием. Хотя делает не совсем то, да.
      Ответить
    • Тоже мне кодревью... Нахера в эту функцию передавать список, если нужен один эелемент?
      В Питоне есть штатная функция any() которая замечательно справляется с поставленной задачей.
      brands = ['Coca Cola', 'Roshen', 'Dim-Sum', 'Pizza Hut']
      
      def extract_brand(x):
          brand = x.lower()
          return any(map(lambda y: y.lower() == brand, brands))

      Если я правильно понял задачу.
      Ответить
      • any вернет True если хотя бы один из элементов True. А нужно получить само значение.
        Тут из встроенных функций filter можно: filter(...)[0], но это изврат и нужно обрабатывать ситуацию с пустым множеством возвращенным filter()
        Ответить
        • А зачем? Мы же знаем, что мы передали аргументом? Зачем нам еще раз возвращать этот же аргумент, у нас по-любому на него ссылка уже есть.
          Ответить
          • > А зачем?
            Потому что в оригинальном коде проверяют не совпадение а вхождение. Т.е. для 'Coca Cola inc' оно должно вернуть 'Coca Cola'.
            Ответить
            • Это, кстати, для меня тожен не понятный вариант. Например, есть бренды "Dominos Pizza" и "Pizza Hut", и передали мы туда "pizza" - работа функции в таком случае представляется бессмысленной.

              Не, наоборот, есть бренд "pizza", а передали какую-то конкретную контору с названием в котором есть слово "пицца". Ну не суть.
              Ответить
              • > Не, наоборот, есть бренд "pizza", а передали какую-то конкретную контору с названием в котором есть слово "пицца". Ну не суть.
                Да, как-то так. Видимо, формат строчки с брендом довольно свободный, и на == его не проверишь. Хотя, тут может быть вообще какое-то нечеткое сравнение нужно, или поиск по наличию ключевых слов...
                Ответить
                • Я это понял еще когда комментарий писал, но это не меняет ситуации. Кроме этого, возможны варианты, когда, например, у нас будет "pizza dominos" и "dominos pizza" и т.п. Если сначала не нормализовать данные, то такой поиск может быть не сильно осмысленным / с большим количеством ошибок. Ну, и если мы можем нормализовать данные, то списки - далеко не самый удачный выбор контейнера для поиска.
                  Ответить
                  • Так у нас вхождение подстроки а не слова, и такая ситуация маловероятна. К тому же 100% точности не будет никогда из-за человеческого фактора - те кто забивают данные еще те лебеди. Когда я делала статистику по тому как называют переплеты в книжных магазинах я даже своим мозгом некоторые чудо сокращения понять не смогла.
                    Ответить
                  • А самое главное список брендов идет с категории товаров и поиск обещает быть достаточно корректным. Специально для тебя посмотрю на количество брендов из двух слов и ситуаций с несколькими найденным вхождениями на следующем заборе данных)
                    Ответить
                    • В любом случае, можно, например, взять CRC от брендов и построить какое-нибудь дерево, то же красно-черное дерево и искать сначала по CRC, а потом уже сравнивать более точно. Если алгоритм предполагается использовать долго и на редко меняющихся но достаточно больших наборах данных, то можно, на эти данные натравить какой-нибудь радужный классификатор / decision tree, который создаст оптимизированые функции поиска. Т.е. классификатор позволил бы выявить уникальные элементы в данных, и на основе работы классификатора можно было бы предложить функцию поиска. Например, классификатор мог выяснить, что наличие буквы "Ы" в бренде уникально для одного-двух брендах, и поэтому лучше начать проверять с наличия этой буквы, дальше - буква "Ж", например и т.д. Таким образом получив логарифмическое время поиска.
                      Ответить
                      • > Таким образом получив логарифмическое время поиска.
                        Преждевременная оптимизация, не? Что-то мне подсказывает, что время поиска в массиве брендов пренебрежимо мало по сравнению со временем исполнения HTTP запроса...

                        Но ответить на этот вопрос может только профилирование (которое никто не будет делать, пока скрипт отрабатывает за приемлемое время).
                        Ответить
                        • Нет, более осмысленный выбор структуры данных.
                          Ответить
                      • "Программист, сделай ка стул о четырех ножках. Таак, надо вывести формулу стула с количеством ножек от 0 до бесконечности и взять от нее..."
                        Нет это специфичный кусочек кода для одного сайта который полагается на его структуру и который был написан за несколько минут. Если понадобится поддержка в другом парсере напишу ее еще раз оттталкиваясь от особенностей текущих данных.
                        Нет ничего хуже универсальных отверток там где они не нужны.
                        Ответить
                        • Чем больше ножек - тем больше шатается. Красота в простоте.
                          Ответить
                          • > Чем больше ножек - тем больше шатается.
                            Если ножек меньше трех - устойчивого положения не добиться. Если больше трех - устойчивость сильно зависит от рельефа пола, да и расход материалов повышается. Оптимальное число ножек - 3.
                            Ответить
                            • Почему не одна ножка с разветвлением внизу?
                              Ответить
                              • > одна ножка с разветвлением внизу
                                Если ветви в плоскости, перпендикулярной ножке - получим зависимость от рельефа пола, стул будет качаться.

                                А если они отходят от центральной под углом - это частный случай трех ножек, но менее надежный, т.к. все нагрузки ложатся на эту ось и точку сопряжения с ветвями ;)

                                У трехногого же стула нагрузка распределяется на все ножки, и они работают, по большей части, на сжатие.
                                Ответить
                                • физика рулит
                                  Ответить
                                  • Сопромат жеж. Брусы и эпюры головного мозга... Эх, жаль, что нам его не преподавали.
                                    Ответить
                                  • > физика рулит
                                    Эх блин, пойти что-ли в kerbal space program порубиться...
                                    Ответить
                                    • что за зверь?
                                      Ответить
                                      • > что за зверь?
                                        Очень годный космосим. Посмотри на ютубе или вики/лурке.
                                        Ответить
                                        • Я щас с утюга сижу - не могу глянуть. Как X ?
                                          Ответить
                                          • > Я щас с утюга сижу
                                            Что-за утюг такой стрёмный, что вики не откроет? У нее же оптимизация под мобилы и все такое...

                                            Ну в общем зеленые человечки покоряют просторы своей солнечной системы. Строишь ракету из говна и палок 100500 разных модулей и запускаешь куда-нибудь. А потом отправляешь еще одну - спасать первых чуваков, которым топлива хватило только в один конец. Попутно вкуриваешь матан rocket science ^_^.

                                            Определенных целей нету, миссий нету, оружия нету. Да оно и не надо, ибо и так море фана и свободы ;)
                                            Ответить
                                            • а, вспомнил. Сосед в такое играл. Я предпочитаю стрелялочки. Ну или квесты типа Wolf among us
                                              Ответить
                                            • Смотрел на ютубе. Стыковка к орбитальной станции понравилась. Но выглядит заумно.
                                              Ответить
                                              • > Но выглядит заумно.
                                                Орбитальная карта пугает из-за кучи меток и траекторий?
                                                Ответить
                                                • Ну нах, я лучше в героев зарублюсь
                                                  Ответить
                                                  • > Ну нах, я лучше в героев зарублюсь
                                                    А я тут уже полчаса компоную ракету, подбирая баки и движки под нужные TWR и ΔV и стараясь не забыть какую-нибудь важную детальку ^_^
                                                    Ответить
                                                    • А то разьебеться ракета о земную ось
                                                      Ответить
                                                    • На Ив садишься что ли? Подо что там еще можно TWR подбирать?
                                                      Ответить
                                                      • > Подо что там еще можно TWR подбирать?
                                                        Под дюну. У меня просто далеко не все научное древо открыто, мощного движка (MainSail или как там его зовут) нету, и TWR при взлете с кербина хрен наберешь...
                                                        Ответить
                                                • > Орбитальная карта пугает
                                                  И это тоже. Сам процесс стыковки выглядит безумным, типа заката солнца вручную. Или просто комментатор был тормоз.
                                                  Ответить
                                                  • На самом деле перехват и стыковка там по-моему самое муторное занятие, из-за этого всегда хочется побольше одним куском запустить. Хотя если понять принцип (совместить все три метки и сближаться на 0.5 м\с), то в самой стыковке ничего сложного, а для перехвата в мехджебе автопилот есть.

                                                    >У меня просто далеко не все научное древо открыто, мощного движка (MainSail или как там его зовут) нету, и TWR при взлете с кербина хрен наберешь...
                                                    В стандартном режиме? Там по-моему достаточно слетать людьми на Минмус и Мун чтобы почти всю науку открыть.
                                                    Хотя по честному на дюну с посадкой и возвратом я так и не слетал ни разу, все время на какие-нибудь безумные проекты отвлекаюсь.

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

                                                      наш человек
                                                      Ответить
                                                    • > совместить все три метки и сближаться на 0.5 м\с
                                                      Тут парковочный радар просто дико неудобный. В орбитере я в свое время спокойно совмещал скорость/направление/цель.

                                                      А в перехвате чего муторного?

                                                      > Там по-моему достаточно слетать людьми на Минмус и Мун чтобы почти всю науку открыть.
                                                      Ну х.з., я давно не запускал KSP, вот на днях решил режим карьеры включить... 120sp дают за привезенный образец грунта с Муны. А тот же набор из MainSail и морковки стоит 300sp. А набор от Kerbodyne вообще 500sp.

                                                      > из-за этого всегда хочется побольше одним куском запустить
                                                      Не только :) Шлюз - не жесткий элемент, и из-за него вечно начинается "я твой дом труба шатал"... На взлете то можно закрепить балками, но потом - уже никак.
                                                      Ответить
                                                      • >120sp дают за привезенный образец грунта с Муны.
                                                        А образца 2-3 из разных биомов, плюс куча отчетов и прочей телеметрии. на минмусе вообще можно особо не напрягаясь раз 4-5 сесть, охватив кучу близлежащих биомов, и еще над всеми оставшимися пролететь.

                                                        >А в перехвате чего муторного?
                                                        Ну, это маневров 5 в общем счете, хоть мехджеб их сильно автоматизирует, но все равно минут 10 или даже полчаса они занимают. Тем более в полностью автоматическом режиме он обычно очень неоптимально действует, так что поднимаю орбиту и выравнивать наклонение надо отдельно.
                                                        А если без мехджеба или скажем с RemoteTech (сетью ретрансляторов) делать, то обычно еще какие-нибудь косяки происходят, то мертвая зона, то затормозить не успел.

                                                        >Не только :) Шлюз - не жесткий элемент, и из-за него вечно начинается "я твой дом труба шатал"... На взлете то можно закрепить балками, но потом - уже никак.
                                                        Это да. Но если все симметрично и без посадок на планеты, то обычно все ок.
                                                        Ответить
                                                        • > и выравнивать наклонение надо отдельно
                                                          Вот, кстати: A more efficient method (less total change in velocity) would be to combine the plane change with the tangential burn at apogee of the transfer orbit. http://www.braeunig.us/space/orbmech.htm#maneuver

                                                          > на минмусе
                                                          О, спасибо, я про него совсем забыл.

                                                          > то обычно все ок
                                                          Там, кстати, аддон вроде бы был со шлюзами без физики.
                                                          Ответить
                                                  • > типа заката солнца вручную
                                                    Ну когда надоест вручную - есть аддон, который стыкует на автомате.

                                                    > Или просто комментатор был тормоз.
                                                    Есть вероятность, что он просто коряво прикрутил RCS.

                                                    > Сам процесс стыковки выглядит безумным
                                                    Можно ссылку на рол, тоже хочу посмотреть ;)
                                                    Ответить
                                                    • > стыкует на автомате
                                                      Читерство, наверное?
                                                      Помнится, какой-то Союз стыковался с каким-то Союзом, но автоматика не шмогла из-за поворота блоков на 180 градусов по оси друг относительно друга.

                                                      > Можно ссылку
                                                      Смотрел примерно через месяц после выхода. Даже в истории не найду, наверное.
                                                      Ответить
                                                      • > Читерство, наверное?
                                                        Ну некоторые считают читерством. Но ведь у реальных космонавтов тоже есть такой чит ;)
                                                        Ответить
                                                        • Это если автоматика не сошла с ума.
                                                          Ответить
                          • Ноль ножек - оптимальнейшее решение.
                            Варианты реализации тоже различаются: можно сидеть на полу; магнитная, антигравитационная или аэродинамическая подвеска.
                            Ответить
                            • > аэродинамическая подвеска
                              Заодно защищает от пригорания жопы на форумах? ;)
                              Ответить
                              • Зависит от температуры потока, скорости, давления и газа.
                                Ответить
                            • Давайте тогда уж сведём задачу в пространство размерности ноль.
                              Ответить
                              • > в пространство размерности ноль
                                Стул это точка, сидящий на нем - она же, и даже небо, и даже аллах являются той же точкой...
                                Ответить
                              • нет такого пространства
                                Ответить
                                • > нет такого пространства
                                  А если найду?

                                  Как тогда эта хрень называется?
                                  P. S. Удивительно, всеобобщающая математика выделила точку из множества пространств.
                                  Это же аналог http://govnokod.ru/16208
                                  Ответить
                                  • Хотя я наврал. все таки есть. хм. Ну видом только для обшности. или как проэкция пространства большей размерности
                                    Ответить
                      • А индексирование и хитровывенутый поиск по самым частым данным я писала при анализе данных - 20 тыс запросов на поиск с кучей параметров на 300тыс итемов. Вот там оно надо было. И то, как только посик стал работать за время выпить чай я прекратила оптимизацию потому что это операция выполнятся максимум раз в день будет (сейчас пару раз в месяц пожалуй)
                        Ну и там не сколько поиск время жрал сколько загрузка, парсинг и сохранение результатов в эксельку.
                        Ответить
      • Сколько уже повидал, а по-прежнему удивляюсь.
        На какие преступления готовы пойти люди лишь бы не писать простой и понятный цикл?
        Ответить
        • У цикла возможность компоновки с другим кодом нулевая. Поэтому цикл нужно инкапсулировать во что-то, что потом можно с чем-то комбинировать. То, что может на первый взгляд показаться нежеланием использовать циклы на самом деле является желанием использовать код повторно.
          Но до этого нужно дорости. Сразу это не очевидно.
          Ответить
          • А тем временем идея вытаскивать бренды понравилась и расплодилась еще на два парсера.
            [brand for brand in brands if " %s " % brand.lower() in title[0].lower()] if title else []
            Ответить
          • >У цикла возможность компоновки с другим кодом нулевая.
            >Но до этого нужно дорости. Сразу это не очевидно.
            Только чтобы повторно использовать простой и быстрый код в 3 строчки люди зачем-то пишут 510.

            Ну и сразу вопрос. Как можно повторно использовать такую вот замечательную лямбду:
            lambda x: [brand
            for brand in brands
            if brand.lower() in x[0].lower()]
            С ненавистным словом for между прочим.
            Ответить
            • Как как, копипастой. Теперь у меня три замечательных слабочитаемых куска кода, все разные. И копипастить куски логики из них не получится как было бы в случае многострочек.

              Но в принципе питонисты такое должны читать, и пока я это все копипастила и меняла в общем привыкла. Все равно парсер состоит из xpath, css (который потом в тот же xpath транслируется) и регулярок больше чем наполовину (а все это гребанные кучки символов).
              Ответить
              • >> Как можно повторно использовать такую вот замечательную лямбду
                > Как как, копипастой.
                Судя по тому, где она уже 2 раза оказалась, копипастой на ГК
                Ответить
            • Где в примере выше 510, Пи?
              Где в цикле простой код? Как измерялась простота?

              Если речь идет о моем примере:
              lambda y: y.lower() == brand

              эта лямбда? Так там сразу же и пример использования, прямо там же.
              Если речь о примере с лямбдой со списком внутри, то использовать так:
              il.brand_in(x)

              В чем проблема?
              Ответить
              • >>Где в примере выше 510, Пи?

                он про гипотетическое паттерноговно и его неумелое использование.

                >>Как измерялась простота?

                в ЭШах?
                Ответить
    • напоминает лиспов (loop).
      Ответить

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