У меня есть список словарей, и я хочу применить к нему запрос фильтра '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')