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

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

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

и позвони с

get_truth(1.0,'>',0.0)

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

5 ответов

Решение

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

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

Составьте отображение строк и операторских функций. Кроме того, вам не нужно условие if/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() это зло: использование eval в Python - плохая практика?

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

import operator

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

get_truth(1.0, operator.gt, 0.0)

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

Вы хотите использовать eval:

if eval(str(inp) + relate + str(cut)):`
>>> 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
>>>
Другие вопросы по тегам