сопоставить запрос типа sql для фильтрации списка словарей в python - PullRequest
1 голос
/ 16 октября 2019

У меня есть список словарей, и я хочу применить к нему запрос фильтра 'SQL like'.

Пользователь предоставляет строку, которая может выглядеть примерно так:

"type1 == Hello && type2 = ~ World "- оператор AND

" type1 == Hello || type2 = ~ World "- OR оператор

Мне удалось отфильтровать один аргумент, например" type1 ==Привет ", без && / ||.

По сути, я изо всех сил пытаюсь отобразить формат «как SQL» на подлинный фильтр в списке словарей, используя && ||(и / или операторы).

Если кто-то может мне помочь, это будет здорово

def filter_host(hosts, filter_str, categories):
    def not_contains(a, b):
        return b not in a

    def and_(a, b):
        return a and b

    def or_(a, b):
        return a or b

    ops = {
        "==": operator.eq,
        "<": operator.lt,
        ">": operator.gt,
        "!=": operator.ne,
        '=~': operator.contains,
        '!~': not_contains,
        '&&': and_,
        '||': or_
    }

    try:
        key, op, value = re.match(r'(\w+)\s*(>|<|(?<!=)~=(?!=)|(?<!=)==(?!=)|(?<!=)>(?!=)|(?<!=)!~(?!=)|(?<!=)!=(?!=))\s*(\w*.*|\d*.*)',
                                  filter_str).groups()
        if key in categories:
            if _keys_mapping.get(key).get('type') == 'float':
                value = float(value)
            elif _keys_mapping.get(key).get('type') == 'int':
                value = int(value)
            operator_func = ops[op]
            filtered_hosts = list(filter(lambda host: operator_func(host.get(_keys_mapping[key]['name']), value), hosts))
            if filtered_hosts:
                return filtered_hosts
            else:
                raise Exception('No matching values')
        else:
            raise Exception('Key not exist. Allowed keys for this query are: ' + ', '.join(categories))
    except ValueError:
        handle_exceptions('Filter option not implanted')
    except AttributeError:
        handle_exceptions('Filter option not implanted')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...