Частичные функции Python вызываются пользователями через модуль functools.
Частичное применение функции
Когда функция выполняется, она должна быть вызвана со всеми необходимыми параметрами. Однако иногда параметры могут быть известны заранее до вызова функции. В этом случае один или несколько параметров функции можно задать заранее, чтобы функцию можно было вызвать с меньшим числом параметров.
Частичная функция принимает функцию, которую нужно использовать, в качестве первого аргумента функции partial(), а аргументы исходной функции передаются как последующие аргументы в partial(), если только не используются именованные аргументы.
Словесного описания может быть недостаточно, чтобы понять, как используются частичные функции, поэтому давайте проиллюстрируем на распространённом примере. В этом примере мы реализуем функцию остатка по модулю, которая для целого числа 100 получает остаток от 100%m для разных значений m.
from functools import partial def mod( n, m ): return n % m mod_by_100 = partial( mod, 100 ) print mod( 100, 7 ) # 2 print mod_by_100( 7 ) # 2
Поскольку в примерах, рассмотренных ранее, обычно используются сложение или умножение, они не передают проблему позиции аргументов частичной функции, что легко может создать ложное впечатление, будто второй аргумент partial также является вторым аргументом исходной функции. Поэтому здесь я выбираю mod для объяснения.
В случае именованных аргументов не нужно следовать позициям или количеству аргументов исходной функции. Давайте посмотрим на другой пример ниже, который демонстрирует, как выполнять преобразования между различными системами счисления.
from functools import partial bin2dec = partial( int, base=2 ) print bin2dec( '0b10001' ) # 17 print bin2dec( '10001' ) # 17 hex2dec = partial( int, base=16 ) print hex2dec( '0x67' ) # 103 print hex2dec( '67' ) # 103
Эти применения частичных функций могут показаться простыми, но они очень полезны. Они позволяют эффективно соблюдать принцип DRY и экономить затраты на программирование.
Перепечатано из Pythoner
Ссылка на статью: http://www.pythoner.com/54.html