Ответ 1
>>> from functools import partial
>>> def f(a, b, c):
... print a, b, c
...
>>> bound_f = partial(f, 1)
>>> bound_f(2, 3)
1 2 3
У меня есть ряд функций с комбинацией аргументов positional и keyword, и я хотел бы привязать один из своих аргументов к заданному значению (которое известно только после определения функции). Есть ли общий способ сделать это?
Моя первая попытка:
def f(a,b,c): print a,b,c
def _bind(f, a): return lambda b,c: f(a,b,c)
bound_f = bind(f, 1)
Однако для этого мне нужно знать точные аргументы, переданные в f
, и не могут использовать одну функцию для связывания всех функций, которые меня интересуют (поскольку они имеют разные списки аргументов).
>>> from functools import partial
>>> def f(a, b, c):
... print a, b, c
...
>>> bound_f = partial(f, 1)
>>> bound_f(2, 3)
1 2 3
Вероятно, вы хотите partial
функцию functools.
Как было предложено MattH answer, functools.partial
- это путь.
Однако ваш вопрос можно прочитать как "как я могу реализовать partial
". Недостаток вашего кода заключается в использовании *args
, **kwargs
- 2 таких применений, на самом деле:
def partial(f, *args, **kwargs):
def wrapped(*args2, **kwargs2):
return f(*args, *args2, **kwargs, **kwargs2)
return wrapped