Сообщить об ошибке.

Функция partial() модуля functools в Python

Заморозить часть аргументов вызываемой функции

Синтаксис:

import functools

new_func = functools.partial(func, /, *args, **keywords)

Параметры:

  • func - любой вызываемый объект,
  • *args - позиционные аргументы func,
  • *keywords - ключевые аргументы func.

Возвращаемое значение:

  • новый объект, который при вызове ведет себя как func.

Описание:

Функция partial() модуля functools возвращает новый объект, который при вызове будет вести себя так же как функция func, вызываемая с помощью позиционных аргументов *args и ключевых аргументов *keywords.

Другими словами, функция partial() частично применяет какие то аргументы к вызываемой функции func, т.е. сохранит их для последующего вызова этой функции с упрощенной записью аргументов.

Если для вызова передается больше аргументов чем определено в функции, то они добавляются к args. Если предоставляются дополнительные ключевые аргументы, они расширяют и переопределяют список ключевых аргументов функции.

Что примерно эквивалентно следующему коду:

def partial(func, /, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = {**keywords, **fkeywords}
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

Функция partial() используется для частичного применения каких то аргументов к вызываемой функции func. Другими словами partial() "замораживает" некоторую часть аргументов и/или ключевых слов, в результате чего создается новый объект с упрощенной записью аргументов вызываемой функции func.

Например она может использоваться для создания вызываемого объекта, который ведет себя как функция int(), где базовый аргумент по умолчанию равен 2:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
# 18

Объект partial() имеет три атрибута только для чтения:

partial.func:

Атрибут partial.func возвращает исходную функцию переданную в качестве первого аргумента partial(). Другими словами, вызовы будут перенаправлены в исходную функцию func с новыми аргументами и ключевыми словами.

partial.args:

Атрибут partial.func возвращает крайние левые позиционные аргументы, с которыми будет вызвана исходная функция func.

partial.keywords:

Атрибут partial.keywords возвращает ключевые аргументы, с которыми будет вызвана исходная функция func.


Пример использования:

>>> from functools import partial

# есть функция с 3-мя аргументами
>>> def say(a, b, c='!'):
...    print(a, b, simbol)

>>> say('Bye', 'Mike')
# Bye Mike !
>>> say('Hello', 'world', c='.')
# Hello world .

# замораживаем аргументы функции 'say()':
# - аргумент 'a' как позиционный со значением 'Hello'
# - аргумент 'b' как ключевой со значением 'Jack'
>>> new_say = partial(say, 'Hello', b='Jack')

# Теперь 'say()' можно вызвать без аргументов,
# как новую функцию new_say()
# т.к. ключевой аргумент 'c' имеет значение
# по умолчанию c='!'
>>> new_say()
# Hello Jack !

# в новой функции new_say() теперь можно 
# менять только не замороженные аргументы
>>> new_say(c='...')
# Hello Jack ...

# атрибут 'args' объекта 'new_say'
>>> new_say.args
# ('Hello',)

# атрибут 'keywords' объекта 'new_say'
>>> new_say.keywords
# {'b': 'Jack'}

# атрибут 'func' объекта 'new_say' передает 
# вызов исходной функции "say(a, b, c='!')"
>>> new_say.func('Bye', 'Jack', c='')
# Bye Jack
>>> new_say.func('How', 'are', c='your?')
# How are your?