= Python Functools = '''`functools`''' is a module supporting the construction of efficient functions. <> ---- == Function Composition == The module provides `partial` and `partialmethod` functions for function composition. Try: {{{ from functools import partial basetwo = partial(int, base=2) basetwo('10010') # 18 }}} `partialmethod` is used in exactly the same way, and just manages the `self`. {{{ class Cat: def say(self, message): print(message) meow = partialmethod(say, "Meow!") }}} The module also exposes two objects (`functools.Placeholder` and `functools.partial`) which are implementation details of these functions. ---- == Function Overloading == The module provides `singledispatch` and `singledispatchmethod` decorators for function overloading. Try: {{{ from functools import singledispatch @singledispatch def makebigger(arg): print(arg + 1) @makebigger.register def _(arg: string): print(arg + "s") @makebigger.register def _(list: string): print(arg.append(0)) }}} `singledispatchmethod` is used in exactly the same way, and just dispatches on the second argument (i.e., does not dispatch on the `self`). ---- == Memoization == The module provides the `lru_cache` and `cache` decorators for memoization. {{{ @lru_cache(maxsize=None) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2) }}} Note that `cache` is the same as `lru_cache(maxsize=None)`. `cached_property` can be made to work in a similar way. ---- == Others == ||'''Function Names''' ||'''Description'''|| ||`functools.cmp_to_key` || || ||`functools.reduce` || || ||`functools.update_wrapper`|| || ||'''Decorator Names''' ||'''Description'''|| ||`functools.total_ordering`|| || ||`functools.wraps` || || ---- == See also == [[https://docs.python.org/3/library/functools.html|Python functools module documentation]] [[https://pymotw.com/3/functools/|Python Module of the Day article for functools]] ---- CategoryRicottone