Как получить операцию сравнения из строки?

У меня есть json-файл и некоторые его поля это операции сравнения в виде строки. Мне нужно перевести его строки в оператор. Я мог бы это сделать примерно так:

if str_operator == '>':
    if a > b:
        pass
    else:
       pass
if str_operator == '<':
    if a < b:
        pass
    else:
        pass
...

Но код в этом случае станет большим.

Я пробовал использовать exec(), и всё было хорошо пока не появились присваивания. Я пытался реализовать все через eval(), но я либо не правильно понял как он работает, либо в eval() нельзя использовать условия.

Надеюсь, что в этом случае есть способ кроме первого.


Ответы (1 шт):

Автор решения: denisnumb

Как вариант, сделать словарь, в котором ключ — строка, представляющая оператор, а значение - функция, принимающая объекты для сравнения:

operator_to_func = {
    '>': lambda a, b: a > b,
    '<': lambda a, b: a < b,
    '>=': lambda a, b: a >= b,
    '<=': lambda a, b: a <= b
}

Использовать можно так:

a, b = 1, 2

for operator in '>', '<', '>=', '<=':
    result = operator_to_func[operator](a, b)
    print(f'{a} {operator} {b} = {result}')

Вывод:

1 > 2 = False
1 < 2 = True
1 >= 2 = False
1 <= 2 = True

Ну либо также через eval:

a, b = 1, 2

for operator in '>', '<', '>=', '<=':
    expression = f'{a}{operator}{b}'
    result = eval(expression)
    print(f'{expression} = {result}')

Вывод будет тот же

→ Ссылка