As the comments indicate you can not simply pass +, -, div.
Другой вариант, который упростил бы ваш код, - это использовать операторский модуль
Рефакторинг кода с использованием операторского модуля
# We obtain operators we will use from operator module
from operator import add, sub, mul, pow
from operator import truediv as div
def calculator(x, y, op):
" Calculator applies the passed-in operator to arguments "
return op(x, y)
# Tests
print(calculator(5, 3, add))
print(calculator(5, 3, sub))
print(calculator(5, 3, mul))
print(calculator(5, 3, div))
print(calculator(5, 3, pow))
Использование исходного ввода строки
Как подсказывает @JLPeyret, операторы упрощают использование словаря для логики c, для которой выбирается операция.
def calculator(x, y, op):
" Calculator applies the passed-in operator to arguments "
d = {'+', add,
'-', sub,
'*', mul,
'/', div,
'**', pow}
return d[op](x, y)
# Tests
print(calculator(5, 3, '+'))
print(calculator(5, 3, '-'))
print(calculator(5, 3, '*'))
print(calculator(5, 3, '/'))
print(calculator(5, 3, '**'))
Выходы в обоих случаях
8
2
15
1.6666666666666667
125