17db96d56Sopenharmony_ci:mod:`functools` --- Higher-order functions and operations on callable objects
27db96d56Sopenharmony_ci==============================================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: functools
57db96d56Sopenharmony_ci   :synopsis: Higher-order functions and operations on callable objects.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Peter Harris <scav@blueyonder.co.uk>
87db96d56Sopenharmony_ci.. moduleauthor:: Raymond Hettinger <python@rcn.com>
97db96d56Sopenharmony_ci.. moduleauthor:: Nick Coghlan <ncoghlan@gmail.com>
107db96d56Sopenharmony_ci.. moduleauthor:: Łukasz Langa <lukasz@langa.pl>
117db96d56Sopenharmony_ci.. moduleauthor:: Pablo Galindo <pablogsal@gmail.com>
127db96d56Sopenharmony_ci.. sectionauthor:: Peter Harris <scav@blueyonder.co.uk>
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci**Source code:** :source:`Lib/functools.py`
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci.. testsetup:: default
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci   import functools
197db96d56Sopenharmony_ci   from functools import *
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci--------------
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciThe :mod:`functools` module is for higher-order functions: functions that act on
247db96d56Sopenharmony_cior return other functions. In general, any callable object can be treated as a
257db96d56Sopenharmony_cifunction for the purposes of this module.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciThe :mod:`functools` module defines the following functions:
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci.. decorator:: cache(user_function)
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci   Simple lightweight unbounded function cache.  Sometimes called
327db96d56Sopenharmony_ci   `"memoize" <https://en.wikipedia.org/wiki/Memoization>`_.
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci   Returns the same as ``lru_cache(maxsize=None)``, creating a thin
357db96d56Sopenharmony_ci   wrapper around a dictionary lookup for the function arguments.  Because it
367db96d56Sopenharmony_ci   never needs to evict old values, this is smaller and faster than
377db96d56Sopenharmony_ci   :func:`lru_cache()` with a size limit.
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci   For example::
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci        @cache
427db96d56Sopenharmony_ci        def factorial(n):
437db96d56Sopenharmony_ci            return n * factorial(n-1) if n else 1
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci        >>> factorial(10)      # no previously cached result, makes 11 recursive calls
467db96d56Sopenharmony_ci        3628800
477db96d56Sopenharmony_ci        >>> factorial(5)       # just looks up cached value result
487db96d56Sopenharmony_ci        120
497db96d56Sopenharmony_ci        >>> factorial(12)      # makes two new recursive calls, the other 10 are cached
507db96d56Sopenharmony_ci        479001600
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   The cache is threadsafe so that the wrapped function can be used in
537db96d56Sopenharmony_ci   multiple threads.  This means that the underlying data structure will
547db96d56Sopenharmony_ci   remain coherent during concurrent updates.
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci   It is possible for the wrapped function to be called more than once if
577db96d56Sopenharmony_ci   another thread makes an additional call before the initial call has been
587db96d56Sopenharmony_ci   completed and cached.
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci   .. versionadded:: 3.9
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. decorator:: cached_property(func)
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   Transform a method of a class into a property whose value is computed once
667db96d56Sopenharmony_ci   and then cached as a normal attribute for the life of the instance. Similar
677db96d56Sopenharmony_ci   to :func:`property`, with the addition of caching. Useful for expensive
687db96d56Sopenharmony_ci   computed properties of instances that are otherwise effectively immutable.
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci   Example::
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci       class DataSet:
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci           def __init__(self, sequence_of_numbers):
757db96d56Sopenharmony_ci               self._data = tuple(sequence_of_numbers)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci           @cached_property
787db96d56Sopenharmony_ci           def stdev(self):
797db96d56Sopenharmony_ci               return statistics.stdev(self._data)
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci   The mechanics of :func:`cached_property` are somewhat different from
827db96d56Sopenharmony_ci   :func:`property`.  A regular property blocks attribute writes unless a
837db96d56Sopenharmony_ci   setter is defined. In contrast, a *cached_property* allows writes.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci   The *cached_property* decorator only runs on lookups and only when an
867db96d56Sopenharmony_ci   attribute of the same name doesn't exist.  When it does run, the
877db96d56Sopenharmony_ci   *cached_property* writes to the attribute with the same name. Subsequent
887db96d56Sopenharmony_ci   attribute reads and writes take precedence over the *cached_property*
897db96d56Sopenharmony_ci   method and it works like a normal attribute.
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci   The cached value can be cleared by deleting the attribute.  This
927db96d56Sopenharmony_ci   allows the *cached_property* method to run again.
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci   Note, this decorator interferes with the operation of :pep:`412`
957db96d56Sopenharmony_ci   key-sharing dictionaries.  This means that instance dictionaries
967db96d56Sopenharmony_ci   can take more space than usual.
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci   Also, this decorator requires that the ``__dict__`` attribute on each instance
997db96d56Sopenharmony_ci   be a mutable mapping. This means it will not work with some types, such as
1007db96d56Sopenharmony_ci   metaclasses (since the ``__dict__`` attributes on type instances are
1017db96d56Sopenharmony_ci   read-only proxies for the class namespace), and those that specify
1027db96d56Sopenharmony_ci   ``__slots__`` without including ``__dict__`` as one of the defined slots
1037db96d56Sopenharmony_ci   (as such classes don't provide a ``__dict__`` attribute at all).
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci   If a mutable mapping is not available or if space-efficient key sharing is
1067db96d56Sopenharmony_ci   desired, an effect similar to :func:`cached_property` can also be achieved by
1077db96d56Sopenharmony_ci   stacking :func:`property` on top of :func:`lru_cache`. See
1087db96d56Sopenharmony_ci   :ref:`faq-cache-method-calls` for more details on how this differs from :func:`cached_property`.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci   .. versionadded:: 3.8
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci.. function:: cmp_to_key(func)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci   Transform an old-style comparison function to a :term:`key function`.  Used
1167db96d56Sopenharmony_ci   with tools that accept key functions (such as :func:`sorted`, :func:`min`,
1177db96d56Sopenharmony_ci   :func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`,
1187db96d56Sopenharmony_ci   :func:`itertools.groupby`).  This function is primarily used as a transition
1197db96d56Sopenharmony_ci   tool for programs being converted from Python 2 which supported the use of
1207db96d56Sopenharmony_ci   comparison functions.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   A comparison function is any callable that accepts two arguments, compares them,
1237db96d56Sopenharmony_ci   and returns a negative number for less-than, zero for equality, or a positive
1247db96d56Sopenharmony_ci   number for greater-than.  A key function is a callable that accepts one
1257db96d56Sopenharmony_ci   argument and returns another value to be used as the sort key.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci   Example::
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci       sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   For sorting examples and a brief sorting tutorial, see :ref:`sortinghowto`.
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci   .. versionadded:: 3.2
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci.. decorator:: lru_cache(user_function)
1377db96d56Sopenharmony_ci               lru_cache(maxsize=128, typed=False)
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci   Decorator to wrap a function with a memoizing callable that saves up to the
1407db96d56Sopenharmony_ci   *maxsize* most recent calls.  It can save time when an expensive or I/O bound
1417db96d56Sopenharmony_ci   function is periodically called with the same arguments.
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci   The cache is threadsafe so that the wrapped function can be used in
1447db96d56Sopenharmony_ci   multiple threads.  This means that the underlying data structure will
1457db96d56Sopenharmony_ci   remain coherent during concurrent updates.
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci   It is possible for the wrapped function to be called more than once if
1487db96d56Sopenharmony_ci   another thread makes an additional call before the initial call has been
1497db96d56Sopenharmony_ci   completed and cached.
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci   Since a dictionary is used to cache results, the positional and keyword
1527db96d56Sopenharmony_ci   arguments to the function must be :term:`hashable`.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci   Distinct argument patterns may be considered to be distinct calls with
1557db96d56Sopenharmony_ci   separate cache entries.  For example, ``f(a=1, b=2)`` and ``f(b=2, a=1)``
1567db96d56Sopenharmony_ci   differ in their keyword argument order and may have two separate cache
1577db96d56Sopenharmony_ci   entries.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci   If *user_function* is specified, it must be a callable. This allows the
1607db96d56Sopenharmony_ci   *lru_cache* decorator to be applied directly to a user function, leaving
1617db96d56Sopenharmony_ci   the *maxsize* at its default value of 128::
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci       @lru_cache
1647db96d56Sopenharmony_ci       def count_vowels(sentence):
1657db96d56Sopenharmony_ci           return sum(sentence.count(vowel) for vowel in 'AEIOUaeiou')
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci   If *maxsize* is set to ``None``, the LRU feature is disabled and the cache can
1687db96d56Sopenharmony_ci   grow without bound.
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci   If *typed* is set to true, function arguments of different types will be
1717db96d56Sopenharmony_ci   cached separately.  If *typed* is false, the implementation will usually
1727db96d56Sopenharmony_ci   regard them as equivalent calls and only cache a single result. (Some
1737db96d56Sopenharmony_ci   types such as *str* and *int* may be cached separately even when *typed*
1747db96d56Sopenharmony_ci   is false.)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci   Note, type specificity applies only to the function's immediate arguments
1777db96d56Sopenharmony_ci   rather than their contents.  The scalar arguments, ``Decimal(42)`` and
1787db96d56Sopenharmony_ci   ``Fraction(42)`` are be treated as distinct calls with distinct results.
1797db96d56Sopenharmony_ci   In contrast, the tuple arguments ``('answer', Decimal(42))`` and
1807db96d56Sopenharmony_ci   ``('answer', Fraction(42))`` are treated as equivalent.
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci   The wrapped function is instrumented with a :func:`cache_parameters`
1837db96d56Sopenharmony_ci   function that returns a new :class:`dict` showing the values for *maxsize*
1847db96d56Sopenharmony_ci   and *typed*.  This is for information purposes only.  Mutating the values
1857db96d56Sopenharmony_ci   has no effect.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci   To help measure the effectiveness of the cache and tune the *maxsize*
1887db96d56Sopenharmony_ci   parameter, the wrapped function is instrumented with a :func:`cache_info`
1897db96d56Sopenharmony_ci   function that returns a :term:`named tuple` showing *hits*, *misses*,
1907db96d56Sopenharmony_ci   *maxsize* and *currsize*.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci   The decorator also provides a :func:`cache_clear` function for clearing or
1937db96d56Sopenharmony_ci   invalidating the cache.
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci   The original underlying function is accessible through the
1967db96d56Sopenharmony_ci   :attr:`__wrapped__` attribute.  This is useful for introspection, for
1977db96d56Sopenharmony_ci   bypassing the cache, or for rewrapping the function with a different cache.
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci   The cache keeps references to the arguments and return values until they age
2007db96d56Sopenharmony_ci   out of the cache or until the cache is cleared.
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci   If a method is cached, the ``self`` instance argument is included in the
2037db96d56Sopenharmony_ci   cache.  See :ref:`faq-cache-method-calls`
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci   An `LRU (least recently used) cache
2067db96d56Sopenharmony_ci   <https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)>`_
2077db96d56Sopenharmony_ci   works best when the most recent calls are the best predictors of upcoming
2087db96d56Sopenharmony_ci   calls (for example, the most popular articles on a news server tend to
2097db96d56Sopenharmony_ci   change each day).  The cache's size limit assures that the cache does not
2107db96d56Sopenharmony_ci   grow without bound on long-running processes such as web servers.
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci   In general, the LRU cache should only be used when you want to reuse
2137db96d56Sopenharmony_ci   previously computed values.  Accordingly, it doesn't make sense to cache
2147db96d56Sopenharmony_ci   functions with side-effects, functions that need to create distinct mutable
2157db96d56Sopenharmony_ci   objects on each call, or impure functions such as time() or random().
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci   Example of an LRU cache for static web content::
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci        @lru_cache(maxsize=32)
2207db96d56Sopenharmony_ci        def get_pep(num):
2217db96d56Sopenharmony_ci            'Retrieve text of a Python Enhancement Proposal'
2227db96d56Sopenharmony_ci            resource = 'https://peps.python.org/pep-%04d/' % num
2237db96d56Sopenharmony_ci            try:
2247db96d56Sopenharmony_ci                with urllib.request.urlopen(resource) as s:
2257db96d56Sopenharmony_ci                    return s.read()
2267db96d56Sopenharmony_ci            except urllib.error.HTTPError:
2277db96d56Sopenharmony_ci                return 'Not Found'
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci        >>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
2307db96d56Sopenharmony_ci        ...     pep = get_pep(n)
2317db96d56Sopenharmony_ci        ...     print(n, len(pep))
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci        >>> get_pep.cache_info()
2347db96d56Sopenharmony_ci        CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   Example of efficiently computing
2377db96d56Sopenharmony_ci   `Fibonacci numbers <https://en.wikipedia.org/wiki/Fibonacci_number>`_
2387db96d56Sopenharmony_ci   using a cache to implement a
2397db96d56Sopenharmony_ci   `dynamic programming <https://en.wikipedia.org/wiki/Dynamic_programming>`_
2407db96d56Sopenharmony_ci   technique::
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci        @lru_cache(maxsize=None)
2437db96d56Sopenharmony_ci        def fib(n):
2447db96d56Sopenharmony_ci            if n < 2:
2457db96d56Sopenharmony_ci                return n
2467db96d56Sopenharmony_ci            return fib(n-1) + fib(n-2)
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci        >>> [fib(n) for n in range(16)]
2497db96d56Sopenharmony_ci        [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci        >>> fib.cache_info()
2527db96d56Sopenharmony_ci        CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   .. versionadded:: 3.2
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci   .. versionchanged:: 3.3
2577db96d56Sopenharmony_ci      Added the *typed* option.
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci   .. versionchanged:: 3.8
2607db96d56Sopenharmony_ci      Added the *user_function* option.
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci   .. versionadded:: 3.9
2637db96d56Sopenharmony_ci      Added the function :func:`cache_parameters`
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci.. decorator:: total_ordering
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci   Given a class defining one or more rich comparison ordering methods, this
2687db96d56Sopenharmony_ci   class decorator supplies the rest.  This simplifies the effort involved
2697db96d56Sopenharmony_ci   in specifying all of the possible rich comparison operations:
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci   The class must define one of :meth:`__lt__`, :meth:`__le__`,
2727db96d56Sopenharmony_ci   :meth:`__gt__`, or :meth:`__ge__`.
2737db96d56Sopenharmony_ci   In addition, the class should supply an :meth:`__eq__` method.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci   For example::
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci       @total_ordering
2787db96d56Sopenharmony_ci       class Student:
2797db96d56Sopenharmony_ci           def _is_valid_operand(self, other):
2807db96d56Sopenharmony_ci               return (hasattr(other, "lastname") and
2817db96d56Sopenharmony_ci                       hasattr(other, "firstname"))
2827db96d56Sopenharmony_ci           def __eq__(self, other):
2837db96d56Sopenharmony_ci               if not self._is_valid_operand(other):
2847db96d56Sopenharmony_ci                   return NotImplemented
2857db96d56Sopenharmony_ci               return ((self.lastname.lower(), self.firstname.lower()) ==
2867db96d56Sopenharmony_ci                       (other.lastname.lower(), other.firstname.lower()))
2877db96d56Sopenharmony_ci           def __lt__(self, other):
2887db96d56Sopenharmony_ci               if not self._is_valid_operand(other):
2897db96d56Sopenharmony_ci                   return NotImplemented
2907db96d56Sopenharmony_ci               return ((self.lastname.lower(), self.firstname.lower()) <
2917db96d56Sopenharmony_ci                       (other.lastname.lower(), other.firstname.lower()))
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci   .. note::
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci      While this decorator makes it easy to create well behaved totally
2967db96d56Sopenharmony_ci      ordered types, it *does* come at the cost of slower execution and
2977db96d56Sopenharmony_ci      more complex stack traces for the derived comparison methods. If
2987db96d56Sopenharmony_ci      performance benchmarking indicates this is a bottleneck for a given
2997db96d56Sopenharmony_ci      application, implementing all six rich comparison methods instead is
3007db96d56Sopenharmony_ci      likely to provide an easy speed boost.
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci   .. note::
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci      This decorator makes no attempt to override methods that have been
3057db96d56Sopenharmony_ci      declared in the class *or its superclasses*. Meaning that if a
3067db96d56Sopenharmony_ci      superclass defines a comparison operator, *total_ordering* will not
3077db96d56Sopenharmony_ci      implement it again, even if the original method is abstract.
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci   .. versionadded:: 3.2
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci   .. versionchanged:: 3.4
3127db96d56Sopenharmony_ci      Returning NotImplemented from the underlying comparison function for
3137db96d56Sopenharmony_ci      unrecognised types is now supported.
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci.. function:: partial(func, /, *args, **keywords)
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci   Return a new :ref:`partial object<partial-objects>` which when called
3187db96d56Sopenharmony_ci   will behave like *func* called with the positional arguments *args*
3197db96d56Sopenharmony_ci   and keyword arguments *keywords*. If more arguments are supplied to the
3207db96d56Sopenharmony_ci   call, they are appended to *args*. If additional keyword arguments are
3217db96d56Sopenharmony_ci   supplied, they extend and override *keywords*.
3227db96d56Sopenharmony_ci   Roughly equivalent to::
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci      def partial(func, /, *args, **keywords):
3257db96d56Sopenharmony_ci          def newfunc(*fargs, **fkeywords):
3267db96d56Sopenharmony_ci              newkeywords = {**keywords, **fkeywords}
3277db96d56Sopenharmony_ci              return func(*args, *fargs, **newkeywords)
3287db96d56Sopenharmony_ci          newfunc.func = func
3297db96d56Sopenharmony_ci          newfunc.args = args
3307db96d56Sopenharmony_ci          newfunc.keywords = keywords
3317db96d56Sopenharmony_ci          return newfunc
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci   The :func:`partial` is used for partial function application which "freezes"
3347db96d56Sopenharmony_ci   some portion of a function's arguments and/or keywords resulting in a new object
3357db96d56Sopenharmony_ci   with a simplified signature.  For example, :func:`partial` can be used to create
3367db96d56Sopenharmony_ci   a callable that behaves like the :func:`int` function where the *base* argument
3377db96d56Sopenharmony_ci   defaults to two:
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci      >>> from functools import partial
3407db96d56Sopenharmony_ci      >>> basetwo = partial(int, base=2)
3417db96d56Sopenharmony_ci      >>> basetwo.__doc__ = 'Convert base 2 string to an int.'
3427db96d56Sopenharmony_ci      >>> basetwo('10010')
3437db96d56Sopenharmony_ci      18
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci.. class:: partialmethod(func, /, *args, **keywords)
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci   Return a new :class:`partialmethod` descriptor which behaves
3497db96d56Sopenharmony_ci   like :class:`partial` except that it is designed to be used as a method
3507db96d56Sopenharmony_ci   definition rather than being directly callable.
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   *func* must be a :term:`descriptor` or a callable (objects which are both,
3537db96d56Sopenharmony_ci   like normal functions, are handled as descriptors).
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci   When *func* is a descriptor (such as a normal Python function,
3567db96d56Sopenharmony_ci   :func:`classmethod`, :func:`staticmethod`, :func:`abstractmethod` or
3577db96d56Sopenharmony_ci   another instance of :class:`partialmethod`), calls to ``__get__`` are
3587db96d56Sopenharmony_ci   delegated to the underlying descriptor, and an appropriate
3597db96d56Sopenharmony_ci   :ref:`partial object<partial-objects>` returned as the result.
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci   When *func* is a non-descriptor callable, an appropriate bound method is
3627db96d56Sopenharmony_ci   created dynamically. This behaves like a normal Python function when
3637db96d56Sopenharmony_ci   used as a method: the *self* argument will be inserted as the first
3647db96d56Sopenharmony_ci   positional argument, even before the *args* and *keywords* supplied to
3657db96d56Sopenharmony_ci   the :class:`partialmethod` constructor.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   Example::
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci      >>> class Cell:
3707db96d56Sopenharmony_ci      ...     def __init__(self):
3717db96d56Sopenharmony_ci      ...         self._alive = False
3727db96d56Sopenharmony_ci      ...     @property
3737db96d56Sopenharmony_ci      ...     def alive(self):
3747db96d56Sopenharmony_ci      ...         return self._alive
3757db96d56Sopenharmony_ci      ...     def set_state(self, state):
3767db96d56Sopenharmony_ci      ...         self._alive = bool(state)
3777db96d56Sopenharmony_ci      ...     set_alive = partialmethod(set_state, True)
3787db96d56Sopenharmony_ci      ...     set_dead = partialmethod(set_state, False)
3797db96d56Sopenharmony_ci      ...
3807db96d56Sopenharmony_ci      >>> c = Cell()
3817db96d56Sopenharmony_ci      >>> c.alive
3827db96d56Sopenharmony_ci      False
3837db96d56Sopenharmony_ci      >>> c.set_alive()
3847db96d56Sopenharmony_ci      >>> c.alive
3857db96d56Sopenharmony_ci      True
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci   .. versionadded:: 3.4
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci.. function:: reduce(function, iterable[, initializer])
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci   Apply *function* of two arguments cumulatively to the items of *iterable*, from
3937db96d56Sopenharmony_ci   left to right, so as to reduce the iterable to a single value.  For example,
3947db96d56Sopenharmony_ci   ``reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`` calculates ``((((1+2)+3)+4)+5)``.
3957db96d56Sopenharmony_ci   The left argument, *x*, is the accumulated value and the right argument, *y*, is
3967db96d56Sopenharmony_ci   the update value from the *iterable*.  If the optional *initializer* is present,
3977db96d56Sopenharmony_ci   it is placed before the items of the iterable in the calculation, and serves as
3987db96d56Sopenharmony_ci   a default when the iterable is empty.  If *initializer* is not given and
3997db96d56Sopenharmony_ci   *iterable* contains only one item, the first item is returned.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci   Roughly equivalent to::
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci      def reduce(function, iterable, initializer=None):
4047db96d56Sopenharmony_ci          it = iter(iterable)
4057db96d56Sopenharmony_ci          if initializer is None:
4067db96d56Sopenharmony_ci              value = next(it)
4077db96d56Sopenharmony_ci          else:
4087db96d56Sopenharmony_ci              value = initializer
4097db96d56Sopenharmony_ci          for element in it:
4107db96d56Sopenharmony_ci              value = function(value, element)
4117db96d56Sopenharmony_ci          return value
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   See :func:`itertools.accumulate` for an iterator that yields all intermediate
4147db96d56Sopenharmony_ci   values.
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci.. decorator:: singledispatch
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   Transform a function into a :term:`single-dispatch <single
4197db96d56Sopenharmony_ci   dispatch>` :term:`generic function`.
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci   To define a generic function, decorate it with the ``@singledispatch``
4227db96d56Sopenharmony_ci   decorator. When defining a function using ``@singledispatch``, note that the
4237db96d56Sopenharmony_ci   dispatch happens on the type of the first argument::
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci     >>> from functools import singledispatch
4267db96d56Sopenharmony_ci     >>> @singledispatch
4277db96d56Sopenharmony_ci     ... def fun(arg, verbose=False):
4287db96d56Sopenharmony_ci     ...     if verbose:
4297db96d56Sopenharmony_ci     ...         print("Let me just say,", end=" ")
4307db96d56Sopenharmony_ci     ...     print(arg)
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci   To add overloaded implementations to the function, use the :func:`register`
4337db96d56Sopenharmony_ci   attribute of the generic function, which can be used as a decorator.  For
4347db96d56Sopenharmony_ci   functions annotated with types, the decorator will infer the type of the
4357db96d56Sopenharmony_ci   first argument automatically::
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci     >>> @fun.register
4387db96d56Sopenharmony_ci     ... def _(arg: int, verbose=False):
4397db96d56Sopenharmony_ci     ...     if verbose:
4407db96d56Sopenharmony_ci     ...         print("Strength in numbers, eh?", end=" ")
4417db96d56Sopenharmony_ci     ...     print(arg)
4427db96d56Sopenharmony_ci     ...
4437db96d56Sopenharmony_ci     >>> @fun.register
4447db96d56Sopenharmony_ci     ... def _(arg: list, verbose=False):
4457db96d56Sopenharmony_ci     ...     if verbose:
4467db96d56Sopenharmony_ci     ...         print("Enumerate this:")
4477db96d56Sopenharmony_ci     ...     for i, elem in enumerate(arg):
4487db96d56Sopenharmony_ci     ...         print(i, elem)
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_ci   :data:`types.UnionType` and :data:`typing.Union` can also be used::
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci    >>> @fun.register
4537db96d56Sopenharmony_ci    ... def _(arg: int | float, verbose=False):
4547db96d56Sopenharmony_ci    ...     if verbose:
4557db96d56Sopenharmony_ci    ...         print("Strength in numbers, eh?", end=" ")
4567db96d56Sopenharmony_ci    ...     print(arg)
4577db96d56Sopenharmony_ci    ...
4587db96d56Sopenharmony_ci    >>> from typing import Union
4597db96d56Sopenharmony_ci    >>> @fun.register
4607db96d56Sopenharmony_ci    ... def _(arg: Union[list, set], verbose=False):
4617db96d56Sopenharmony_ci    ...     if verbose:
4627db96d56Sopenharmony_ci    ...         print("Enumerate this:")
4637db96d56Sopenharmony_ci    ...     for i, elem in enumerate(arg):
4647db96d56Sopenharmony_ci    ...         print(i, elem)
4657db96d56Sopenharmony_ci    ...
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci   For code which doesn't use type annotations, the appropriate type
4687db96d56Sopenharmony_ci   argument can be passed explicitly to the decorator itself::
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci     >>> @fun.register(complex)
4717db96d56Sopenharmony_ci     ... def _(arg, verbose=False):
4727db96d56Sopenharmony_ci     ...     if verbose:
4737db96d56Sopenharmony_ci     ...         print("Better than complicated.", end=" ")
4747db96d56Sopenharmony_ci     ...     print(arg.real, arg.imag)
4757db96d56Sopenharmony_ci     ...
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci   To enable registering :term:`lambdas<lambda>` and pre-existing functions,
4797db96d56Sopenharmony_ci   the :func:`register` attribute can also be used in a functional form::
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci     >>> def nothing(arg, verbose=False):
4827db96d56Sopenharmony_ci     ...     print("Nothing.")
4837db96d56Sopenharmony_ci     ...
4847db96d56Sopenharmony_ci     >>> fun.register(type(None), nothing)
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci   The :func:`register` attribute returns the undecorated function. This
4877db96d56Sopenharmony_ci   enables decorator stacking, :mod:`pickling<pickle>`, and the creation
4887db96d56Sopenharmony_ci   of unit tests for each variant independently::
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci     >>> @fun.register(float)
4917db96d56Sopenharmony_ci     ... @fun.register(Decimal)
4927db96d56Sopenharmony_ci     ... def fun_num(arg, verbose=False):
4937db96d56Sopenharmony_ci     ...     if verbose:
4947db96d56Sopenharmony_ci     ...         print("Half of your number:", end=" ")
4957db96d56Sopenharmony_ci     ...     print(arg / 2)
4967db96d56Sopenharmony_ci     ...
4977db96d56Sopenharmony_ci     >>> fun_num is fun
4987db96d56Sopenharmony_ci     False
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci   When called, the generic function dispatches on the type of the first
5017db96d56Sopenharmony_ci   argument::
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci     >>> fun("Hello, world.")
5047db96d56Sopenharmony_ci     Hello, world.
5057db96d56Sopenharmony_ci     >>> fun("test.", verbose=True)
5067db96d56Sopenharmony_ci     Let me just say, test.
5077db96d56Sopenharmony_ci     >>> fun(42, verbose=True)
5087db96d56Sopenharmony_ci     Strength in numbers, eh? 42
5097db96d56Sopenharmony_ci     >>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
5107db96d56Sopenharmony_ci     Enumerate this:
5117db96d56Sopenharmony_ci     0 spam
5127db96d56Sopenharmony_ci     1 spam
5137db96d56Sopenharmony_ci     2 eggs
5147db96d56Sopenharmony_ci     3 spam
5157db96d56Sopenharmony_ci     >>> fun(None)
5167db96d56Sopenharmony_ci     Nothing.
5177db96d56Sopenharmony_ci     >>> fun(1.23)
5187db96d56Sopenharmony_ci     0.615
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci   Where there is no registered implementation for a specific type, its
5217db96d56Sopenharmony_ci   method resolution order is used to find a more generic implementation.
5227db96d56Sopenharmony_ci   The original function decorated with ``@singledispatch`` is registered
5237db96d56Sopenharmony_ci   for the base :class:`object` type, which means it is used if no better
5247db96d56Sopenharmony_ci   implementation is found.
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci   If an implementation is registered to an :term:`abstract base class`,
5277db96d56Sopenharmony_ci   virtual subclasses of the base class will be dispatched to that
5287db96d56Sopenharmony_ci   implementation::
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci     >>> from collections.abc import Mapping
5317db96d56Sopenharmony_ci     >>> @fun.register
5327db96d56Sopenharmony_ci     ... def _(arg: Mapping, verbose=False):
5337db96d56Sopenharmony_ci     ...     if verbose:
5347db96d56Sopenharmony_ci     ...         print("Keys & Values")
5357db96d56Sopenharmony_ci     ...     for key, value in arg.items():
5367db96d56Sopenharmony_ci     ...         print(key, "=>", value)
5377db96d56Sopenharmony_ci     ...
5387db96d56Sopenharmony_ci     >>> fun({"a": "b"})
5397db96d56Sopenharmony_ci     a => b
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci   To check which implementation the generic function will choose for
5427db96d56Sopenharmony_ci   a given type, use the ``dispatch()`` attribute::
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci     >>> fun.dispatch(float)
5457db96d56Sopenharmony_ci     <function fun_num at 0x1035a2840>
5467db96d56Sopenharmony_ci     >>> fun.dispatch(dict)    # note: default implementation
5477db96d56Sopenharmony_ci     <function fun at 0x103fe0000>
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci   To access all registered implementations, use the read-only ``registry``
5507db96d56Sopenharmony_ci   attribute::
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci    >>> fun.registry.keys()
5537db96d56Sopenharmony_ci    dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
5547db96d56Sopenharmony_ci              <class 'decimal.Decimal'>, <class 'list'>,
5557db96d56Sopenharmony_ci              <class 'float'>])
5567db96d56Sopenharmony_ci    >>> fun.registry[float]
5577db96d56Sopenharmony_ci    <function fun_num at 0x1035a2840>
5587db96d56Sopenharmony_ci    >>> fun.registry[object]
5597db96d56Sopenharmony_ci    <function fun at 0x103fe0000>
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci   .. versionadded:: 3.4
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci   .. versionchanged:: 3.7
5647db96d56Sopenharmony_ci      The :func:`register` attribute now supports using type annotations.
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci   .. versionchanged:: 3.11
5677db96d56Sopenharmony_ci      The :func:`register` attribute now supports :data:`types.UnionType`
5687db96d56Sopenharmony_ci      and :data:`typing.Union` as type annotations.
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci.. class:: singledispatchmethod(func)
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci   Transform a method into a :term:`single-dispatch <single
5747db96d56Sopenharmony_ci   dispatch>` :term:`generic function`.
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci   To define a generic method, decorate it with the ``@singledispatchmethod``
5777db96d56Sopenharmony_ci   decorator. When defining a function using ``@singledispatchmethod``, note
5787db96d56Sopenharmony_ci   that the dispatch happens on the type of the first non-*self* or non-*cls*
5797db96d56Sopenharmony_ci   argument::
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci    class Negator:
5827db96d56Sopenharmony_ci        @singledispatchmethod
5837db96d56Sopenharmony_ci        def neg(self, arg):
5847db96d56Sopenharmony_ci            raise NotImplementedError("Cannot negate a")
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci        @neg.register
5877db96d56Sopenharmony_ci        def _(self, arg: int):
5887db96d56Sopenharmony_ci            return -arg
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci        @neg.register
5917db96d56Sopenharmony_ci        def _(self, arg: bool):
5927db96d56Sopenharmony_ci            return not arg
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci   ``@singledispatchmethod`` supports nesting with other decorators such as
5957db96d56Sopenharmony_ci   :func:`@classmethod<classmethod>`. Note that to allow for
5967db96d56Sopenharmony_ci   ``dispatcher.register``, ``singledispatchmethod`` must be the *outer most*
5977db96d56Sopenharmony_ci   decorator. Here is the ``Negator`` class with the ``neg`` methods bound to
5987db96d56Sopenharmony_ci   the class, rather than an instance of the class::
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci    class Negator:
6017db96d56Sopenharmony_ci        @singledispatchmethod
6027db96d56Sopenharmony_ci        @classmethod
6037db96d56Sopenharmony_ci        def neg(cls, arg):
6047db96d56Sopenharmony_ci            raise NotImplementedError("Cannot negate a")
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci        @neg.register
6077db96d56Sopenharmony_ci        @classmethod
6087db96d56Sopenharmony_ci        def _(cls, arg: int):
6097db96d56Sopenharmony_ci            return -arg
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci        @neg.register
6127db96d56Sopenharmony_ci        @classmethod
6137db96d56Sopenharmony_ci        def _(cls, arg: bool):
6147db96d56Sopenharmony_ci            return not arg
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci   The same pattern can be used for other similar decorators:
6177db96d56Sopenharmony_ci   :func:`@staticmethod<staticmethod>`,
6187db96d56Sopenharmony_ci   :func:`@abstractmethod<abc.abstractmethod>`, and others.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   .. versionadded:: 3.8
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci.. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci   Update a *wrapper* function to look like the *wrapped* function. The optional
6267db96d56Sopenharmony_ci   arguments are tuples to specify which attributes of the original function are
6277db96d56Sopenharmony_ci   assigned directly to the matching attributes on the wrapper function and which
6287db96d56Sopenharmony_ci   attributes of the wrapper function are updated with the corresponding attributes
6297db96d56Sopenharmony_ci   from the original function. The default values for these arguments are the
6307db96d56Sopenharmony_ci   module level constants ``WRAPPER_ASSIGNMENTS`` (which assigns to the wrapper
6317db96d56Sopenharmony_ci   function's ``__module__``, ``__name__``, ``__qualname__``, ``__annotations__``
6327db96d56Sopenharmony_ci   and ``__doc__``, the documentation string) and ``WRAPPER_UPDATES`` (which
6337db96d56Sopenharmony_ci   updates the wrapper function's ``__dict__``, i.e. the instance dictionary).
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci   To allow access to the original function for introspection and other purposes
6367db96d56Sopenharmony_ci   (e.g. bypassing a caching decorator such as :func:`lru_cache`), this function
6377db96d56Sopenharmony_ci   automatically adds a ``__wrapped__`` attribute to the wrapper that refers to
6387db96d56Sopenharmony_ci   the function being wrapped.
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci   The main intended use for this function is in :term:`decorator` functions which
6417db96d56Sopenharmony_ci   wrap the decorated function and return the wrapper. If the wrapper function is
6427db96d56Sopenharmony_ci   not updated, the metadata of the returned function will reflect the wrapper
6437db96d56Sopenharmony_ci   definition rather than the original function definition, which is typically less
6447db96d56Sopenharmony_ci   than helpful.
6457db96d56Sopenharmony_ci
6467db96d56Sopenharmony_ci   :func:`update_wrapper` may be used with callables other than functions. Any
6477db96d56Sopenharmony_ci   attributes named in *assigned* or *updated* that are missing from the object
6487db96d56Sopenharmony_ci   being wrapped are ignored (i.e. this function will not attempt to set them
6497db96d56Sopenharmony_ci   on the wrapper function). :exc:`AttributeError` is still raised if the
6507db96d56Sopenharmony_ci   wrapper function itself is missing any attributes named in *updated*.
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ci   .. versionadded:: 3.2
6537db96d56Sopenharmony_ci      Automatic addition of the ``__wrapped__`` attribute.
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci   .. versionadded:: 3.2
6567db96d56Sopenharmony_ci      Copying of the ``__annotations__`` attribute by default.
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci   .. versionchanged:: 3.2
6597db96d56Sopenharmony_ci      Missing attributes no longer trigger an :exc:`AttributeError`.
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci   .. versionchanged:: 3.4
6627db96d56Sopenharmony_ci      The ``__wrapped__`` attribute now always refers to the wrapped
6637db96d56Sopenharmony_ci      function, even if that function defined a ``__wrapped__`` attribute.
6647db96d56Sopenharmony_ci      (see :issue:`17482`)
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci.. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci   This is a convenience function for invoking :func:`update_wrapper` as a
6707db96d56Sopenharmony_ci   function decorator when defining a wrapper function.  It is equivalent to
6717db96d56Sopenharmony_ci   ``partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)``.
6727db96d56Sopenharmony_ci   For example::
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci      >>> from functools import wraps
6757db96d56Sopenharmony_ci      >>> def my_decorator(f):
6767db96d56Sopenharmony_ci      ...     @wraps(f)
6777db96d56Sopenharmony_ci      ...     def wrapper(*args, **kwds):
6787db96d56Sopenharmony_ci      ...         print('Calling decorated function')
6797db96d56Sopenharmony_ci      ...         return f(*args, **kwds)
6807db96d56Sopenharmony_ci      ...     return wrapper
6817db96d56Sopenharmony_ci      ...
6827db96d56Sopenharmony_ci      >>> @my_decorator
6837db96d56Sopenharmony_ci      ... def example():
6847db96d56Sopenharmony_ci      ...     """Docstring"""
6857db96d56Sopenharmony_ci      ...     print('Called example function')
6867db96d56Sopenharmony_ci      ...
6877db96d56Sopenharmony_ci      >>> example()
6887db96d56Sopenharmony_ci      Calling decorated function
6897db96d56Sopenharmony_ci      Called example function
6907db96d56Sopenharmony_ci      >>> example.__name__
6917db96d56Sopenharmony_ci      'example'
6927db96d56Sopenharmony_ci      >>> example.__doc__
6937db96d56Sopenharmony_ci      'Docstring'
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci   Without the use of this decorator factory, the name of the example function
6967db96d56Sopenharmony_ci   would have been ``'wrapper'``, and the docstring of the original :func:`example`
6977db96d56Sopenharmony_ci   would have been lost.
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci.. _partial-objects:
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci:class:`partial` Objects
7037db96d56Sopenharmony_ci------------------------
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci:class:`partial` objects are callable objects created by :func:`partial`. They
7067db96d56Sopenharmony_cihave three read-only attributes:
7077db96d56Sopenharmony_ci
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci.. attribute:: partial.func
7107db96d56Sopenharmony_ci
7117db96d56Sopenharmony_ci   A callable object or function.  Calls to the :class:`partial` object will be
7127db96d56Sopenharmony_ci   forwarded to :attr:`func` with new arguments and keywords.
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci.. attribute:: partial.args
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci   The leftmost positional arguments that will be prepended to the positional
7187db96d56Sopenharmony_ci   arguments provided to a :class:`partial` object call.
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci.. attribute:: partial.keywords
7227db96d56Sopenharmony_ci
7237db96d56Sopenharmony_ci   The keyword arguments that will be supplied when the :class:`partial` object is
7247db96d56Sopenharmony_ci   called.
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ci:class:`partial` objects are like :class:`function` objects in that they are
7277db96d56Sopenharmony_cicallable, weak referencable, and can have attributes.  There are some important
7287db96d56Sopenharmony_cidifferences.  For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes
7297db96d56Sopenharmony_ciare not created automatically.  Also, :class:`partial` objects defined in
7307db96d56Sopenharmony_ciclasses behave like static methods and do not transform into bound methods
7317db96d56Sopenharmony_ciduring instance attribute look-up.
732