Однако некоторые API позволяют вам передавать аргументы, подлежащие привязке, отдельно и будут выполнять привязку за вас. Примечательно, что threading API в стандартной библиотеке работает таким образом. Смотрите, поток запускается перед вызовом Thread.start. Если вы пытаетесь настроить свой собственный API подобным образом, смотрите Как я могу написать простую функцию обратного вызова?.
Явная привязка аргументов также является способом избежать проблем, вызванных поздней привязкой при использовании замыканий. Это проблема, когда, например, lambda внутри for цикла или понимания списка создаются отдельные функции, которые вычисляют один и тот же результат. Смотрите, что фиксируют замыкания лямбда-функций? и создание функций (или лямбд) в цикле (или понимание).
Переведено автоматически
Ответ 1
functools.partial возвращает вызываемую функцию, обертывающую некоторые или все аргументы замороженными.
lambdas позволяют создать новую безымянную функцию с меньшим количеством аргументов и вызвать функцию:
>>> deffoobar(x, y, z): ... print(f'{x}, {y}, {z}') ... >>> foobar(1, 2, 3) # call normal function 1, 2, 3 >>> bind = lambda x: foobar(x, 10, 20) # bind 10 and 20 to foobar >>> bind(1) 1, 10, 20 >>> bind = lambda: foobar(1, 2, 3) # bind all elements >>> bind() 1, 2, 3
Вы также можете использовать functools.partial. Если вы планируете использовать привязку именованных аргументов при вызове функции, это также применимо:
Обратите внимание, что если вы привязываете аргументы слева, вам нужно вызывать аргументы по имени. Если вы привязываете справа, это работает так, как ожидалось.
>>> barfoo(5, 6) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foobar() got multiple values for argument 'x' >>> f = partial(foobar, z=20) >>> f(1, 1) 1, 1, 20