Как передать оператор в функцию 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
>>>