В этом уроке рассмотрим функцию partial()
из модуля functools. Эта функция возвращает новый объект, который при вызове будет вести себя так же, как функция func
с позиционными аргументами *args
и ключевыми аргументами *keywords
.
Синтаксис:
import functools
new_func = functools.partial(func, /, *args, **keywords)
Аргументы:
func
- любой вызываемый объект, функция, класс.*args
- позиционные аргументы func,*keywords
- ключевые аргументы func.
Если вызываемой функции передается больше аргументом, чем определенно в функции, то они добавляется к args
. Если предоставляются дополнительные аргументы ключевого слова, они расширяются и переопределяют список аргументов ключевого слова функции.
Функция partial()
используется для частичного применения некоторых аргументов к вызываемой функции func
. Другими словами, partial()
«замораживает» часть аргументов и/или ключевых слов, поэтому новый объект создается с упрощенной регистрацией аргументов функции, называемой func
.
Например, его можно использовать для создания вызываемого объекта, который ведет себя как функция int()
, где базовый аргумент по умолчанию равен 3:
Пример:
from functools import partial
basetwo = partial(int, base=3)
basetwo.__doc__ = 'Convert base 3 string to an int.'
print(basetwo('10010'))
Результат: 84
Объект partial()
имеет три атрибута только для чтения:
partial.func
- атрибут возвращает исходную функцию, переданную в качестве первого аргумента в partial(). Другими словами, вызовы перенаправляются на исходную функцию func с новыми аргументами и ключевыми словами.partial.args
- атрибут возвращает крайние левые позиционные аргументы, используемые для вызова исходной функции func.partial.keywords
- атрибут возвращает ключевые аргументы, используемые для вызова исходной функции func.
Пример:
from functools import partial
# Создаем функцию с 3 переменными
def person(name, age, sep='!'):
print(name, age, sep)
person('Владислав', 23, '.')
# Замораживаем 3 аргумент
new_person = partial(person, name='Владислав', age=24)
new_person()
# Атрибут 'args' объекта 'new_person'
print(new_person.args)
# Атрибут 'keywords' объекта 'new_person'
print(new_person.keywords)
# Атрибут 'func' объекта 'new_person' передает вызов исходной функции "person(name, age, sep='!')"
new_person.func('Владислав', 25, '!')
Результат:
>>> Владислав 23 .
>>> Владислав 24 !
>>> ()
>>> {'name': 'Владислав', 'age': 24}
>>> Владислав 25 !