Как передать аргумент в функцию заранее?

Пусть есть некая функция, принимающая два аргумента:

def foo(a, b):
    ...
    return something

Существует ли более правильный и питонистский способ добавить в эту функцию заранее, например, первый аргумент, кроме лямбды?

foo = lambda b: foo(a=some_value, b)

Память подсказывает, что я что-то такое когда-то видел во время учёбы, связанное с редко используемыми возможностями Python, но так и не смог вспомнить что. Гугление на русском и английском и попытки полапатить документацию ничего не дали.

Этот вопрос не совсем абстрактный, например, re.sub принимает как аргумент функцию, которая должная принимать только один аргумент типа re.Match. В моей текущей задаче эта функция должна обращаться к внешнему словарю, а я не хочу портить код globalами и nonlocalами.


Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

>>> some_value = 5
>>> 
>>> def foo(b, a=some_value):
    some_value = a + b
    return some_value

>>> foo(2)
7
>>> 
→ Ссылка
Автор решения: CrazyElf

Можно ещё использовать 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)
→ Ссылка