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

functools.md

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

1> **Источник:** https://python-all.ru/2.7/library/functools.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 9.8. [`functools`](https://python-all.ru/2.7/library/functools.html#module-functools) – Функции высшего порядка и операции с вызываемыми объектами89Новое в версии 2.5.1011**Исходный код:** [Lib/functools.py](https://python-all.ru/src/2.7/Lib/functools.py)1213---1415Модуль [`functools`](https://python-all.ru/2.7/library/functools.html#module-functools) предназначен для функций высшего порядка: функций, которые действуют на или возвращают другие функции. В общем случае любой вызываемый объект может рассматриваться как функция для целей этого модуля.1617Модуль [`functools`](https://python-all.ru/2.7/library/functools.html#module-functools) определяет следующие функции:1819#### `functools.cmp_to_key(func)`2021Преобразует функцию сравнения старого стиля в [ключевую функцию](https://python-all.ru/2.7/glossary.html#term-key-function). Используется с инструментами, которые принимают ключевые функции (такими как [`sorted()`](https://python-all.ru/2.7/library/functions.html#sorted), [`min()`](https://python-all.ru/2.7/library/functions.html#min), [`max()`](https://python-all.ru/2.7/library/functions.html#max), [`heapq.nlargest()`](https://python-all.ru/2.7/library/heapq.html#heapq.nlargest), [`heapq.nsmallest()`](https://python-all.ru/2.7/library/heapq.html#heapq.nsmallest), [`itertools.groupby()`](https://python-all.ru/2.7/library/itertools.html#itertools.groupby)). Эта функция в основном используется как переходный инструмент для программ, переносимых на Python 3, где функции сравнения больше не поддерживаются.2223Функция сравнения – это любой вызываемый объект, который принимает два аргумента, сравнивает их и возвращает отрицательное число, если первый меньше второго, ноль при равенстве или положительное число, если первый больше второго. Функция ключа – это вызываемый объект, который принимает один аргумент и возвращает другое значение, используемое в качестве ключа сортировки.2425Пример:2627```python28sorted(iterable, key=cmp_to_key(locale.strcoll))  # порядок сортировки с учётом локали29```3031Примеры сортировки и краткое руководство см. в [Sorting HOW TO](https://python-all.ru/2.7/howto/sorting.html#sortinghowto).3233Новое в версии 2.7.3435#### `functools.total_ordering(cls)`3637Для класса, определяющего один или несколько методов расширенного сравнения, этот декоратор класса предоставляет остальные. Это упрощает задачу определения всех возможных операций расширенного сравнения:3839Класс должен определять один из [`__lt__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__lt__), [`__le__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__le__), [`__gt__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__gt__) или [`__ge__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__ge__). Кроме того, класс должен предоставлять метод [`__eq__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__eq__).4041Например:4243```python44@total_ordering45class Student:46    def __eq__(self, other):47        return ((self.lastname.lower(), self.firstname.lower()) ==48                (other.lastname.lower(), other.firstname.lower()))49    def __lt__(self, other):50        return ((self.lastname.lower(), self.firstname.lower()) <51                (other.lastname.lower(), other.firstname.lower()))52```5354Новое в версии 2.7.5556#### `functools.reduce(function, iterable[, initializer])`5758Это та же функция, что и [`reduce()`](https://python-all.ru/2.7/library/functions.html#reduce). Она доступна в этом модуле, чтобы позволить писать код, более совместимый с будущими версиями Python 3.5960Новое в версии 2.6.6162#### `functools.partial(func[,*args][, **keywords])`6364Возвращает новый [объект partial](https://python-all.ru/2.7/library/functools.html#partial-objects), который при вызове ведёт себя как *func*, вызванная с позиционными аргументами *args* и именованными аргументами *keywords*. Если при вызове передаётся больше аргументов, они добавляются к *args*. Если передаются дополнительные именованные аргументы, они расширяют и переопределяют *keywords*. Примерно соответствует:6566```python67def partial(func, *args, **keywords):68    def newfunc(*fargs, **fkeywords):69        newkeywords = keywords.copy()70        newkeywords.update(fkeywords)71        return func(*(args + fargs), **newkeywords)72    newfunc.func = func73    newfunc.args = args74    newfunc.keywords = keywords75    return newfunc76```7778[`partial()`](https://python-all.ru/2.7/library/functools.html#functools.partial) используется для частичного применения функции, которое «замораживает» некоторую часть аргументов и/или ключевых слов функции, создавая новый объект с упрощённой сигнатурой. Например, [`partial()`](https://python-all.ru/2.7/library/functools.html#functools.partial) можно использовать для создания вызываемого объекта, который ведёт себя как функция [`int()`](https://python-all.ru/2.7/library/functions.html#int), где аргумент *base* по умолчанию равен двум:7980```python81>>> from functools import partial82>>> basetwo = partial(int, base=2)83>>> basetwo.__doc__ = 'Convert base 2 string to an int.'84>>> basetwo('10010')851886```8788#### `functools.update_wrapper(wrapper, wrapped[, assigned][, updated])`8990Обновляет функцию-обёртку *wrapper*, чтобы она выглядела как функция *wrapped*. Необязательные аргументы – кортежи, определяющие, какие атрибуты исходной функции напрямую присваиваются соответствующим атрибутам функции-обёртки, а какие атрибуты функции-обёртки обновляются соответствующими атрибутами исходной функции. Значения по умолчанию для этих аргументов – константы уровня модуля *WRAPPER\_ASSIGNMENTS* (которая присваивает функции-обёртке атрибуты *\_\_name\_\_*, *\_\_module\_\_* и *\_\_doc\_\_*, строку документации) и *WRAPPER\_UPDATES* (которая обновляет *\_\_dict\_\_* функции-обёртки, т.е. словарь экземпляра).9192Основное назначение этой функции – использование в [decorator](https://python-all.ru/2.7/glossary.html#term-decorator)-функциях, которые оборачивают декорированную функцию и возвращают обёртку. Если функция-обёртка не обновляется, метаданные возвращаемой функции будут отражать определение обёртки, а не исходной функции, что обычно не очень полезно.9394#### `functools.wraps(wrapped[, assigned][, updated])`9596Это удобная функция для вызова [`update_wrapper()`](https://python-all.ru/2.7/library/functools.html#functools.update_wrapper) в качестве декоратора функции при определении функции-обёртки. Она эквивалентна `partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)`. Например:9798```python99>>> from functools import wraps100>>> def my_decorator(f):101...     @wraps(f)102...     def wrapper(*args, **kwds):103...         print 'Calling decorated function'104...         return f(*args, **kwds)105...     return wrapper106...107>>> @my_decorator108... def example():109...     """докстринг"""110...     print 'Called example function'111...112>>> example()113Calling decorated function114Called example function115>>> example.__name__116'example'117>>> example.__doc__118'Docstring'119```120121Без использования этой фабрики декораторов имя примера функции было бы `'wrapper'`, а строка документации исходной `example()` была бы потеряна.122123## 9.8.1. [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial) Объекты124125Объекты [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial) – это вызываемые объекты, создаваемые [`partial()`](https://python-all.ru/2.7/library/functools.html#functools.partial). Они имеют три атрибута только для чтения:126127#### `partial.func`128129Вызываемый объект или функция. Вызовы объекта [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial) будут перенаправлены в [`func`](https://python-all.ru/2.7/library/functools.html#functools.partial.func) с новыми аргументами и ключевыми словами.130131#### `partial.args`132133Крайние левые позиционные аргументы, которые будут добавлены перед позиционными аргументами, переданными при вызове объекта [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial).134135#### `partial.keywords`136137Ключевые аргументы, которые будут предоставлены при вызове объекта [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial).138139Объекты [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial) похожи на объекты `function` тем, что они вызываемы, могут быть слабыми ссылками и могут иметь атрибуты. Есть несколько важных отличий. Например, атрибуты [`__name__`](https://python-all.ru/2.7/library/stdtypes.html#definition.__name__) и `__doc__` не создаются автоматически. Кроме того, объекты [`partial`](https://python-all.ru/2.7/library/functools.html#functools.partial), определённые в классах, ведут себя как статические методы и не превращаются в связанные методы при поиске атрибута экземпляра.140