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