Как передать оператор функции python?

Я хотел бы передать математический оператор вместе с числовыми значениями для сравнения с функцией. Вот мой сломанный код:

def get_truth(inp,relate,cut):    
    if inp print(relate) cut:
        return True
    else:
        return False

и назовите его

get_truth(1.0,'>',0.0)

который должен вернуть True.

Ответы

Ответ 1

Посмотрите на операторский модуль:

import operator
get_truth(1.0, operator.gt, 0.0)

...

def get_truth(inp, relate, cut):    
    return relate(inp, cut)
    # you don't actually need an if statement here

Ответ 2

Сделайте отображение строк и operator. Кроме того, вам не нужно, если /else условие:

import operator


def get_truth(inp, relate, cut):
    ops = {'>': operator.gt,
           '<': operator.lt,
           '>=': operator.ge,
           '<=': operator.le,
           '=': operator.eq}
    return ops[relate](inp, cut)


print get_truth(1.0, '>', 0.0)  # prints True
print get_truth(1.0, '<', 0.0)  # prints False
print get_truth(1.0, '>=', 0.0)  # prints True
print get_truth(1.0, '<=', 0.0)  # prints False
print get_truth(1.0, '=', 0.0)  # prints False

FYI, eval() is evil: Использует ли eval в Python плохую практику?

Ответ 3

Используйте модуль operator. Он содержит все стандартные операторы, которые можно использовать в python. Затем используйте оператор как функцию:

import operator

def get_truth(inp, op, cut):
    return op(inp, cut):

get_truth(1.0, operator.gt, 0.0)

Если вы действительно хотите использовать строки как операторы, тогда создайте сопоставление словаря из строки в операторную функцию, как предположил @alecxe.

Ответ 4

>>> def get_truth(inp,relate,cut):
...     if eval("%s%s%s" % (inp,relate,cut)):
...         return True
...     else:
...         return False
...
>>> get_truth(1.0,'>',0.0)
True
>>>

Ответ 5

Изменение: вы не хотите использовать eval !

Вместо этого используйте модуль operator:

import operator
def get_truth(inp, relate, cut):
    rel_ops = {
        '>': operator.gt,
        '<': operator.lt,
        '>=': operator.ge,
        '<=': operator.le,
        '==': operator.eq,
        '!=': operator.ne
    }
    return rel_ops[relate](inp, cut)