Возможно ли использовать карту оператора для автоматической генерации указанного оператора?

#python #dictionary #operators

#python #словарь #операторы

Вопрос:

У меня есть некоторые правила, сохраненные в базе данных mysql.

  ---- --------- ------- ---------- ------- ------- 
| id | rule_id | field | operator | value | order | 
 ---- --------- ------- ---------- ------- ------- 
|  1 |       1 |     5 |        2 |     8 |     1 | 
|  2 |       1 |    10 |        2 |     2 |     2 |   
|  3 |       1 |     4 |        2 |     1 |     3 |  

...

# operator 2 is equal to GREATER_THAN for example
  

Затем я хочу отфильтровать список данных, используя соответствующий оператор правила, как показано в приведенном ниже коде

 operator = "LESS_THAN"   # get from mysql db

target_value = 8

list1 = [{'clicks':5, "views":7, 'id':1234}, {'clicks':5, "views":9, 'id':1235}]

filtered_list = [i['id'] for i in  filter(lambda item: item['views'] > target_value, list1)]

# filter the list according to operator > ,target_value 8 for example.
  

Возможно ли использовать отношение карты, подобное

 operation_map = {
    "LESS_THAN" : <,
    "GREATER_THAN": >,
    "EQUAL":=
}

  

чтобы вместо if operator == 'GREATER_THAN' : pass синтаксиса получилось что-то вроде приведенного ниже?

 filtered_list = [i['id'] for i in  filter(lambda item: item['views'] operation_map[operator] target_value, list1)]
  

Любая помощь или понимание были бы с благодарностью приняты, большое спасибо.

Комментарии:

1. Зачем вам это нужно? операторы более удобочитаемы, и если объекты вашего класса их реализовали, вы можете использовать просто лямбда-функцию для их сортировки.

Ответ №1:

Используйте operator модуль:

 import operator

operator_map = {'LESS_THAN': operator.lt,
                'GREATER_THAN': operator.gt,
                'EQUAL': operator.eq}

filtered_list = [i['id'] for i in  filter(lambda item: operator_map[operator](item['views'], target_value), list1)]
  

При необходимости добавляйте другие операторы.