может ли функция быть одной из kwargs в python частичной? - PullRequest
0 голосов
/ 18 марта 2020

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

from functools import partial

def B(alpha, x, y):
    return alpha(x)*y

def alpha(x):
    return x+1

g = partial(B, alpha=alpha, y=2)
print(g(5))

Это выдает ошибку:

TypeError: B () получил несколько значений для аргумента 'alpha'

Может ли partial обрабатывать функции в качестве аргументов? Если нет, то есть ли обходной путь или что-то более общее c, чем partial? Спасибо

1 Ответ

1 голос
/ 18 марта 2020

partial сам не знает, что данный позиционный аргумент должен быть присвоен x только потому, что вы указали ключевой аргумент для alpha. Если вы хотите, чтобы alpha была определенной функцией, передайте эту функцию в качестве позиционного аргумента partial.

>>> g = partial(B, alpha, y=2)
>>> g(5)
12

g эквивалентно

def g(x):
    return alpha(x) * 2  #  == (x + 1) * 2

Кроме того, вы можете использовать исходное определение g, но обязательно укажите 5 в качестве аргумента ключевого слова, избегая любых дополнительных позиционных аргументов.

>>> g = partial(B, alpha=alpha, y=2)
>>> g(x=5)
12

Это работает, поскольку между g и partial, вы предоставили ключевые аргументы для всех обязательных параметров, исключая необходимость в позиционных аргументах.

...