Ответ 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
Я хотел бы передать математический оператор вместе с числовыми значениями для сравнения с функцией. Вот мой сломанный код:
def get_truth(inp,relate,cut):
if inp print(relate) cut:
return True
else:
return False
и назовите его
get_truth(1.0,'>',0.0)
который должен вернуть True.
Посмотрите на операторский модуль:
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
Сделайте отображение строк и 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 плохую практику?
Используйте модуль operator
. Он содержит все стандартные операторы, которые можно использовать в python. Затем используйте оператор как функцию:
import operator
def get_truth(inp, op, cut):
return op(inp, cut):
get_truth(1.0, operator.gt, 0.0)
Если вы действительно хотите использовать строки как операторы, тогда создайте сопоставление словаря из строки в операторную функцию, как предположил @alecxe.
>>> 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
>>>
Изменение: вы не хотите использовать 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)