Документация Python неофициальный перевод

functools.md

151 строк · 9.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.0/library/functools.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `functools` – функции высшего порядка и операции с вызываемыми объектами89Модуль `functools` предназначен для функций высшего порядка: функций, которые действуют на другие функции или возвращают их. В общем случае любой вызываемый объект можно рассматривать как функцию для целей этого модуля.1011Модуль `functools` определяет следующие функции:1213#### `[functools.partial]functools.partial(func[, *args][, **keywords])`1415Возвращает новый объект [`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial), который при вызове будет вести себя как *func*, вызванная с позиционными аргументами *args* и именованными аргументами *keywords*. Если в вызов передаётся больше аргументов, они добавляются к *args*. Если передаются дополнительные именованные аргументы, они расширяют и переопределяют *keywords*. Примерно эквивалентно:1617```python18def partial(func, *args, **keywords):19    def newfunc(*fargs, **fkeywords):20        newkeywords = keywords.copy()21        newkeywords.update(fkeywords)22        return func(*(args + fargs), **newkeywords)23    newfunc.func = func24    newfunc.args = args25    newfunc.keywords = keywords26    return newfunc27```2829[`partial()`](https://python-all.ru/3.0/library/functools.html#functools.partial) используется для частичного применения функции, которое «замораживает» некоторую часть аргументов и/или ключевых слов функции, создавая новый объект с упрощённой сигнатурой. Например, [`partial()`](https://python-all.ru/3.0/library/functools.html#functools.partial) можно использовать для создания вызываемого объекта, который ведёт себя как функция [`int()`](https://python-all.ru/3.0/library/functions.html#int), где аргумент *base* по умолчанию равен двум:3031```python32>>> from functools import partial33>>> basetwo = partial(int, base=2)34>>> basetwo.__doc__ = 'Convert base 2 string to an int.'35>>> basetwo('10010')361837```3839#### `[functools.reduce]functools.reduce(function, iterable[, initializer])`4041Применяет4243*function*4445с двумя аргументами последовательно к элементам4647*sequence*4849слева направо, сводя последовательность к одному значению. Например,5051`reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`5253вычисляет5455`((((1+2)+3)+4)+5)`5657. Левый аргумент,5859*x*6061, является накопленным значением, а правый аргумент,6263*y*6465, – обновляемым значением из6667*sequence*6869. Если присутствует необязательный7071*initializer*7273, он помещается перед элементами последовательности в вычислении и служит значением по умолчанию, когда последовательность пуста. Если7475*initializer*7677не задан и7879*sequence*8081содержит только один элемент, возвращается первый элемент.8283#### `[functools.update_wrapper]functools.update_wrapper(wrapper, wrapped[, assigned][, updated])`8485Обновляет функцию-обёртку *wrapper*, чтобы она выглядела как функция *wrapped*. Необязательные аргументы – кортежи, определяющие, какие атрибуты исходной функции напрямую присваиваются соответствующим атрибутам функции-обёртки, а какие атрибуты функции-обёртки обновляются соответствующими атрибутами исходной функции. Значения по умолчанию для этих аргументов – константы уровня модуля *WRAPPER\_ASSIGNMENTS* (которая присваивает функции-обёртке атрибуты *\_\_name\_\_*, *\_\_module\_\_* и *\_\_doc\_\_*, строку документации) и *WRAPPER\_UPDATES* (которая обновляет *\_\_dict\_\_* функции-обёртки, т.е. словарь экземпляра).8687Основное назначение этой функции – использование в [*decorator*](https://python-all.ru/3.0/glossary.html#term-decorator)-функциях, которые оборачивают декорированную функцию и возвращают обёртку. Если функция-обёртка не обновляется, метаданные возвращаемой функции будут отражать определение обёртки, а не исходной функции, что обычно не очень полезно.8889#### `[functools.wraps]functools.wraps(wrapped[, assigned][, updated])`9091Это удобная функция для вызова `partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)` в качестве декоратора функции при определении функции-обёртки. Например:9293```python94>>> from functools import wraps95>>> def my_decorator(f):96...     @wraps(f)97...     def wrapper(*args, **kwds):98...         print('Calling decorated function')99...         return f(*args, **kwds)100...     return wrapper101...102>>> @my_decorator103... def example():104...     """докстринг"""105...     print('Called example function')106...107>>> example()108Calling decorated function109Called example function110>>> example.__name__111'example'112>>> example.__doc__113'Docstring'114```115116Без использования этой фабрики декораторов имя примерной функции было бы `'wrapper'`, а строка документации исходной `example()` была бы потеряна.117118## [`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial) Объекты119120[`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial) объекты – это вызываемые объекты, создаваемые с помощью [`partial()`](https://python-all.ru/3.0/library/functools.html#functools.partial). Они имеют три атрибута только для чтения:121122#### `[functools.partial.func]partial.func`123124Вызываемый объект или функция. Вызовы объекта125126[`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial)127128будут перенаправлены к129130[`func`](https://python-all.ru/3.0/library/functools.html#functools.partial.func)131132с новыми аргументами и ключевыми словами.133134#### `[functools.partial.args]partial.args`135136Крайние слева позиционные аргументы, которые будут добавлены в начало позиционных аргументов, передаваемых при вызове объекта137138[`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial)139140.141142#### `[functools.partial.keywords]partial.keywords`143144Ключевые аргументы, которые будут предоставлены, когда объект145146[`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial)147148будет вызван.149150Объекты [`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial) похожи на объекты `function` в том, что они являются вызываемыми, могут быть слабыми ссылками и могут иметь атрибуты. Есть несколько важных отличий. Например, атрибуты `__name__` и `__doc__` не создаются автоматически. Кроме того, объекты [`partial`](https://python-all.ru/3.0/library/functools.html#functools.partial), определённые в классах, ведут себя как статические методы и не превращаются в связанные методы при поиске атрибутов экземпляра.151