Как передать аргумент в функцию заранее?
Пусть есть некая функция, принимающая два аргумента:
def foo(a, b):
...
return something
Существует ли более правильный и питонистский способ добавить в эту функцию заранее, например, первый аргумент, кроме лямбды?
foo = lambda b: foo(a=some_value, b)
Память подсказывает, что я что-то такое когда-то видел во время учёбы, связанное с редко используемыми возможностями Python, но так и не смог вспомнить что. Гугление на русском и английском и попытки полапатить документацию ничего не дали.
Этот вопрос не совсем абстрактный, например, re.sub принимает как аргумент функцию, которая должная принимать только один аргумент типа re.Match. В моей текущей задаче эта функция должна обращаться к внешнему словарю, а я не хочу портить код globalами и nonlocalами.
Ответы (2 шт):
Попробуйте так:
>>> some_value = 5
>>>
>>> def foo(b, a=some_value):
some_value = a + b
return some_value
>>> foo(2)
7
>>>
Можно ещё использовать functools.partial, но только если хотите заменить последние именованные аргументы, с первыми так не получится из-за особенностей питона:
from functools import partial
def foo(a, b):
...
return something
foo2 = partial(foo, b = some_value)
foo2(123)
Ну, вернее, первые тоже можно заменить, но потом при вызове тогда явно придётся указывать названия оставшихся аргументов:
foo2 = partial(foo, a = 2)
foo2(b=3)