Differences between revisions 3 and 6 (spanning 3 versions)
Revision 3 as of 2021-03-27 11:41:36
Size: 6720
Editor: ProfMilki
Comment: introduce a table to collect a few more samples (right now it's mostly links to stdlib manual)
Revision 6 as of 2023-11-28 03:47:40
Size: 9661
Editor: RaviGupta
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
A page for useful (or potentially abusive?) decorator ideas. See also PythonDecoratorLibrary. And apart from decorators in the standard library, there are also lots of PyPI packages with convenient, interesting or novel use cases:
Line 4: Line 4:
|| builtin || [[https://docs.python.org/3/library/functions.html?highlight=property#property|@property]] || Turn function into propery accessor, also: `@property.setter` || || builtin || [[https://docs.python.org/3/library/functions.html?highlight=property#property|@property]] || Turn function into property accessor, also: `@property.setter` ||
Line 13: Line 13:
|| stdlib || [[https://python.readthedocs.io/en/stable/library/typing.html#typing.overload|@typing.overload]] || Singledispatch based on function parameter or return types ||
Line 18: Line 19:
|| stdlib || [[https://docs.python.org/3/library/xmlrpc.server.html?highlight=decorator#xmlrpc.server.SimpleXMLRPCServer.register_function|@xmlrpc.….register_function]] || ... || || stdlib || [[https://docs.python.org/3a/library/xmlrpc.server.html?highlight=decorator#xmlrpc.server.SimpleXMLRPCServer.register_function|@xmlrpc.register_function]] || ... ||
|| stdlib || [[https://docs.python.org/3/library/sys.html#sys.settrace|@sys.settrace]] || Register function as debugger callback ||
Line 24: Line 26:
|| threading || [[https://gitlab.com/chadgh/ornamentation|@threaded, @debug, @skip_if_env]] || Convenient threading wrapper, and testing wrappers ||
|| threading || [[https://pypi.org/project/lockorator/|@lock_or_wait]] || Aquire and release locks for functions ||
Line 26: Line 30:
|| debugging || [[https://pypi.org/project/handy-decorators/|@trycatch ]] || Capture exceptions to the log ||
|| debugging || [[https://pythonhosted.org/log_calls/intro.html|@log_calls]] || Record invocations with arguments ||
Line 30: Line 36:
|| decorator || [[https://pypi.org/project/pydecor/|@log_call, @intercept, @instead, @before]] || Simplifies decorator construnction/interactions, parameter handling ||
|| decorator || [[https://pypi.org/project/undecorated/|undecorated(fn)]] || reversible decoration ||
Line 33: Line 41:
|| collect || [[https://pypi.org/project/pyplugs/|@expose, @register]] || Plugin interface/registration ||
Line 34: Line 43:
|| typing || [[https://pypi.org/project/pedantic/|@pedantic, @trace, @dirty, …]] || Encourages cleaner and better documented code ||
|| typing || [[https://pypi.org/project/classy-decorators/|@Decorator]] || OO-style class/method parameters ||
|| typing || [[https://pypi.org/project/decorateme/|@mutable, @final, @auto_obj]] || decorators for str/repr, equality, immutability, and more ||
|| typing || [[https://pypi.org/project/paprika/|@to_string, @data, @repeat]] || Reduces some common boilerplate for methods ||
|| typing || [[https://pypi.org/project/pyAttributes/|@DataAtrribute("desc")]] || .NET-like attributes ||
|| parameter || [[https://pypi.org/project/simplecurry/|@curried]] || Convenient decorator-alternative to partial() ||
|| parameter || [[https://www.attrs.org/en/stable/|@attrs]] || object declarations ||
|| parameter || [[https://pypi.org/project/python-args/|@arg.validate]] || simplifies parameter handling/assertion ||
Line 36: Line 53:
|| flow handling || [[https://pypi.org/project/retryz/|@retry]] || Rerun function in case of exceptions ||
|| flow handling || [[https://pypi.org/project/self/|@self]] || method chaining (fluent interfaces) ||
Line 39: Line 58:
(Note: Not sure this is going anywhere. Relisting builtins is somewhat redundant, but topical. The
focus is novel/interesting decorators in the wild. The categorization probably won't hold up.)
(Note: Not sure this is going anywhere. Relisting builtins is somewhat redundant, but on topic here.
The focus is novel/interesting decorators in the wild. The categorization probably won't hold up;
and probably going to split this up into sections.)
Line 42: Line 62:

=== Other decorator links ===

 * [[https://github.com/lord63/awesome-python-decorator|Awesome Python decorator collection (GitHub)]]
 * [[https://pypi.org/search/?q=decorator|PyPI decorator packages]] (gets interesting around page 10)

See also PythonDecoratorLibrary. And apart from decorators in the standard library, there are also lots of PyPI packages with convenient, interesting or novel use cases:

Category

Decorator

Summary

builtin

@property

Turn function into property accessor, also: @property.setter

builtin

@classsmethod

Use cls instead of self

builtin

@staticmethod

Defines methods without self handle

stdlib

@functools.wraps

Retain modicum of meta infos (__doc__) of wrapped function

stdlib

@functools.singledispatch

Allows for divergent implementations per @f.register()

stdlib/backports

@functools.lru_cache

Wrap computationally expensive functions

stdlib

@functools.cmp_to_key

Transform an old-style comparison function to a key function.

stdlib

@functools.total_ordering

Adds any of the missing lt,le,eq,ge,gt comparison dunder methods

stdlib

@functools.partial

Prepopulate a couple of function arguments

stdlib

@typing.overload

Singledispatch based on function parameter or return types

stdlib

@contextlib.contextmanager

Uses generator protocol yield to turn function into with-able context mananger

stdlib

@dataclasses.dataclass

Adds various “dunder” methods to the class to streamline property access

stdlib

@atexit.register

Run as shutdown function

stdlib

@abc.ABCMeta.register

Turn into abstract base class

stdlib

@enum.unique

Guarantee unique members in enum class

stdlib

@xmlrpc.register_function

...

stdlib

@sys.settrace

Register function as debugger callback

asyncio

@coroutine

Outdated scheme for async def, deprecated in 3.8

asyncio

@throttle(2,1)

Reduce invocations per timeframe

asyncio

@exceptionCatcher…

Log exceptions more instantly

asyncio

@timeit

Basic benchmarking

async

@async_process

make func async and execute in other process

threading

@threaded, @debug, @skip_if_env

Convenient threading wrapper, and testing wrappers

threading

@lock_or_wait

Aquire and release locks for functions

testing

@unittest.mock.patch

Override function w/ signature

testing

@wrapt.patch_function_wrapper

Override function w/ signature

debugging

@trycatch

Capture exceptions to the log

debugging

@log_calls

Record invocations with arguments

decorator

@decorator

Assists declaring signature-preserving and single dispatch decorators

decorator

@decorator_args

Ease parameterizing decorators themselvess

decorator

@named_decorator

Retain callees' function name to simplify tracebacks

decorator

@dec.decorator(before=cb,after=cb)

Craft trivial enter/exit decorator

decorator

@log_call, @intercept, @instead, @before

Simplifies decorator construnction/interactions, parameter handling

decorator

undecorated(fn)

reversible decoration

collect

@click.option("-d")

Argparse alternative

collect

@config_decorator.setting

Declarative dict structure for application settings

collect

@regex_decorator.listen

Register function callbacks for pattern matching

collect

@expose, @register

Plugin interface/registration

typing

@contract({"param":gt(3)})

Exhaustive function parameter constraints

typing

@pedantic, @trace, @dirty, …

Encourages cleaner and better documented code

typing

@Decorator

OO-style class/method parameters

typing

@mutable, @final, @auto_obj

decorators for str/repr, equality, immutability, and more

typing

@to_string, @data, @repeat

Reduces some common boilerplate for methods

typing

@DataAtrribute("desc")

.NET-like attributes

parameter

@curried

Convenient decorator-alternative to partial()

parameter

@attrs

object declarations

parameter

@arg.validate

simplifies parameter handling/assertion

flow handling

@__main__

Automatically run a function if invocation script

flow handling

@retry(times=2)

Reinvokes function a few times when encountering (temporary) exceptions, alt: pypi:retry-decorator

flow handling

@retry

Rerun function in case of exceptions

flow handling

@self

method chaining (fluent interfaces)

monkeypatching

@inject(modules…)

Shorthand assignment to modules/objects

monkeypatching

@monkeybiz.patch(fn)

Swap out function in object, retain reference to original

(Note: Not sure this is going anywhere. Relisting builtins is somewhat redundant, but on topic here. The focus is novel/interesting decorators in the wild. The categorization probably won't hold up; and probably going to split this up into sections.)

__main__

This decorator does not alter a function, but causes it to be executed if __name__ == '__main__'. This provides an experimental cleaner syntax to the traditional way of bootstrapping a python script. This should not be used on class methods.

The function gets a copied list of sys.argv arguments.

   1 def __main__(func):
   2 
   3     if __name__ == "__main__":
   4         import sys, os
   5         args = sys.argv[:]
   6         args[0] = os.path.abspath(args[0])
   7         func(args)

Decorators (last edited 2023-11-28 03:47:40 by RaviGupta)

Unable to edit the page? See the FrontPage for instructions.