Передача в функцию функции с именованными переменными
Задача состоит в том чтобы передать в функцию в качестве аргумента другую функцию с указанием конкретных значений именованных переменных.
На примере:
def summ(a, b, k = 1):
return (a + b) * k
def subtract(a, b, k = 1):
return (a - b) * k
def calculate(function, a, b):
y = function(a, b)
print('The result of the function is', y)
return a + b
n1 = 4
n2 = 7
calculate(summ(n1, n2, k = 2), n1, n2)
В текущем виде код не работает, выдает ошибку "'int' object is not callable", по видимому проблема в том что внутри функции calculate происходит попытка запихнуть аргументы a и b в функцию для которой они уже определены (даже если значения изначально у них одинаковы).
Если вызывать функцию таким образом:
calculate(summ, n1, n2)
то все работает. Но нужна именно возможность уже на этом этапе задавать конкретное значение параметра k.
Возможно ли это как то сделать? Без использования глобальных переменных и без передачи k отдельным аргументом функции calculate.
Я начинающий пользователь Python, и подозреваю что упускаю какое то очевидное решение, но самому его найти мне не удалось.
Ответы (3 шт):
from functools import partial
calculate(partical(summ, some arguments), n1, n2))
Заместо some arguments через запятую пишите сначала неименованные аргументы сколько вам нужно, а потом именованные, функция partical по сути заполняет часть аргументов как аргументы по умолчанию, и дает доопределить
Пример:
from functools import partical def plus(a,b): return a + b new_plus = partical(plus, 5) # эквивалентно функции plus с одним аргументом b и вторым аргументом по умолчанию a = 5. print(plus(5)) # 10 print(plus(4)) # 9 ```
Можно например сделать так:
def calculate(function, a, b, **kwargs):
y = function(a, b, **kwargs)
print('The result of the function is', y)
return a + b
n1 = 4
n2 = 7
calculate(summ, n1, n2, k=2)
Правильно подозреваете. Вам нужно смотреть на partial фунцию
Вот примерно что она делает:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc