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

    −98

    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
    def in_params(json, value, par_name, par_type, key=None):
            """
            @param: par_type in [int, float, str, bool]
            @return: is parameter in json
            """
            if isinstance(json, dict):
                return any(in_params(v, value, par_name, par_type, key=k) for k, v in json.iteritems())
    
            if isinstance(json, list):
                return any(in_params(e, value, par_name, par_type, key=None) for e in json)
    
            # it's time to check value
            if par_name and par_name != key:
                return False
    
            try:
                if par_type == 'str':
                    return json.lower() == value.lower()
                # type cast
                return eval("""%s(%s) == %s(%s)""" % (par_type, json, par_type, value))
            except:
                return False

    воюю с типизацией.

    Запостил: orion, 23 Апреля 2014

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

    • а откуда json берется, что:
      1) неизвестен ее тип
      2) автор не боится в эвал ее передавать, если это строка


      ........



      сорь, ступил на счет 2
      Ответить
    • >eval("""%s(%s)""" % (par_type, json))
      Бля, это эпично.

      Что такое par_name?
      Ответить
      • по ключу 'par_name' лежит значение 'value'
        Ответить
        • Оно рекурсивно просматривает структуру данных, что ли? Зачем этот бред с eval? Короче, можно поправить.
          Ответить
          • да. рекурсивно обходим json и проверяем есть ли среди детей заданный элемент value (если бы он был типа par_type) и если указан параметр key, value должен лежать именно по ключу key.
            Ответить
          • >Зачем этот бред с eval?
            в некоторых json'ах значения - 0, в некоторых '0' или 0.0. Хочется найти все нули
            Ответить
            • float(x)==0 ?
              Запомни, eval не нужен. Помимо потенциальной уязвимости, он может выдать что угодно.

              Алсо, хорошо прописывать не только назначение, но и типы переменных.

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

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

      И какую бы не решает, решает он её через жопу.
      Ответить
      • >И какую бы не решает, решает он её через жопу.
        Ответить
      • код используется для фильтрации документов в монге, у которых есть указанное поле.
        юскейс, например, такой - найти все документы, у которых по ключу 'BlahBlahEnabled' лежит труъ (хотя там может быть например 1 или 1.0 или True)
        Ответить
        • почему для этого нельзя использовать монго-запрос?
          Ответить
          • BlahBlahEnabled может лежать где-то глубоко. ниасилил такой запрос. вот и навелосипедил.
            Ответить
            • Мда, отсутствие схемы, видимо, было не лучшей идеей. Дай людям волю - превратят всё в бесформенное говно.
              Ответить
              • В данном случае (админка игры) как по мне, то наоборот - без схемы удобнее. часто меняются модели данных - монга в самый раз.
                Ответить
                • Проблема в том, что код в топике переносит поиск из шустрой монги в тормозное питоноговно, в котором невозможно разобраться. Отсутствие формальной схемы не означает, что понятной стабильной схемы или хотя бы соглашений не должно быть. К примеру, опциональное присутствие у документа топ-левел свойства BlahBlahEnabled.
                  Ответить
                  • если выносить ВСЕ свойства - в топ-левел, то теряется весь смысл древовидной структуры. (напомню, имя свойства, по которому идет фильтрации также передается как параметр, в нашем примере par_name = 'BlahBlahEnabled')

                    Вообще я немного наврал - схема у документов есть и хранится она тоже в монге. Но меняться она может хоть каждую минуту. Как только это понадобится разрабам игры.

                    И можно было бы один раз по схеме найти путь до параметра(также выполнить рекурсивный обход) и брать значения по этому найденному пути.
                    Но скорость поиска вполне сносная, да и пользуются им редко:) http://risovach.ru/upload/2013/10/mem/vovka_32787390_orig_.jpeg
                    Ответить
                    • > если выносить ВСЕ свойства - в топ-левел
                      Не обязательно в топлевел и не обязательно все. Можно и в enabledFeatures.BlaBla, главное, чтобы был известный, фиксированный путь.
                      Ответить
                  • Он еще и за o(n) в словаре ищет.
                    Ответить
                    • Дык а как еще, если неизвестно на каком уровне у него значение?
                      Ответить
                      • По ключу за O(1) же можно.
                        Ответить
                        • Дык тут по этому ключу может лежать еще массив в котором словарь, в котором массив, в котором словарь с нужным значением... За О(1) можно только на текущем уровне поймать.
                          Ответить
                          • Но он даже этого не сделал.
                            Ответить
                            • А надо? Один хер если не найдется - придется последовательно обходить все ветки. Если от этого и ускорится - то немножко.
                              Ответить
                              • Это так тяжело было сделать?

                                Ну главная проблема тут - автору пришла в голову идея, и он реализует ее напролом.
                                Ответить
                                • Главная проблема тут - что нужный автору флаг может валяться в хуй знает где. А остальное - просто последствия ;)

                                  > Но меняться она может хоть каждую минуту. Как только это понадобится разрабам игры.
                                  А если разрабы переименуют этот параметр, а не просто перенесут? :)
                                  Ответить
                                  • значит так и надо. и документ не должен попасть под фильтр
                                    Ответить
                      • борманд, сообрази какой-нибудь сервак для srp и скажи, как мне на винде курл с ним достать. У меня mingw какой-то завалялся.
                        Ответить
                        • Ну вечерком апач с mod_gnutls попробую. Вроде как должен работать.

                          Насчет curl'а - у меня сейчас нету виртуалки с mingw, и настраивать ее вломы, так что х.з. Сборка на офсайте без TLS-SRP?
                          Ответить
                          • Год назад - нет. У меня есть какой-то мингв, можно им попробовать, если скажешь как. Алсо, гоу в тред, чтобы инфа не терялась.
                            Ответить
                            • > Год назад - нет.
                              Да попробуй для начала бинарники curl и openssl с офсайта скачать. Вдруг они все правильно собрали?

                              > Алсо, гоу в тред
                              Пароль от гвфорума только дома, сорри.
                              Ответить
                              • Заведи себе вторую учетку. Алсо, пасс на говнокод должен быть простым :)
                                Ответить
    • Выглядит как борьба с здравым смыслом а не типизацией.
      Ответить
    • Еще и поиск сначала-вглубину с полным перебором всего дерева в худшем случае (в надежде на то, что это все-таки дерево а не граф с циклами).
      БД, ну на счет монги не знаю, но может оптимизировать такого рода поиск разными техниками, например, динамическое програмирование. Ну и, конечно, может там объектов совсем не много, но если много, то имеет смысл задуматься о более рациональных способах поиска, даже в непроинформированом поиске есть лучше варианты, то же постепенное углубление или поиск лучем.
      Ответить
      • >в надежде на то, что это все-таки дерево а не граф с циклами
        в монговских json'ах не может быть циклов. это древовидная структура

        >может там объектов совсем не много
        именно так. поэтому время поиска тут не является узким местом.
        Больше тут доставляет "eval")
        Ответить

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