Metadata-Version: 2.1
Name: singledispatchmethod
Version: 1.0
Summary: Backport of @functools.singledispatchmethod to Python 2.7-3.7.
Home-page: https://github.com/ikalnytskyi/singledispatchmethod
Author: Ihor Kalnytskyi
Author-email: ihor@kalnytskyi.com
License: MIT
Project-URL: Documentation, https://docs.python.org/3.8/library/functools.html#functools.singledispatchmethod
Project-URL: Source, https://github.com/ikalnytskyi/singledispatchmethod
Project-URL: Bugs, https://github.com/ikalnytskyi/singledispatchmethod/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Python Software Foundation License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries
Description-Content-Type: text/x-rst
Requires-Dist: singledispatch ; python_version < "3.4"

singledispatchmethod
====================

Backport of ``@functools.singledispatchmethod`` decorator [1]_ from
Python 3.8 to Python 2.7-3.7. These are merely ~30 lines of code, but
why bother yourself with copypasta?

.. code:: bash

   $ pip install singledispatchmethod

The decorator transforms a method into a single-dispatch [2]_ generic
function [3]_. Note that since the dispatch happens on the type of the
first non-self or non-cls argument, you have to create your function
accordingly:

.. code:: python

    from singledispatchmethod import singledispatchmethod

    class Negator:

        @singledispatchmethod
        def neg(self, arg):
            raise NotImplementedError("Cannot negate a")

        @neg.register
        def _(self, arg: int):
            return -arg

        @neg.register
        def _(self, arg: bool):
            return not arg

``@singledispatchmethod`` supports nesting with other decorators such as
``@classmethod``. However, in order to expose ``dispatcher.register``,
``@singledispatchmethod`` must be the *outer most* decorator. Here is
the ``Negator`` class with the ``neg`` methods being class bound:

.. code:: python

    from singledispatchmethod import singledispatchmethod

    class Negator:

        @singledispatchmethod
        @classmethod
        def neg(cls, arg):
            raise NotImplementedError("Cannot negate a")

        @neg.register
        @classmethod
        def _(cls, arg: int):
            return -arg

        @neg.register
        @classmethod
        def _(cls, arg: bool):
            return not arg

The same pattern can be used for other similar decorators, such as
``@staticmethod`` or ``@abstractmethod``. Please note, since
``@singledispatchmethod`` decorator is based on
``@functools.singledispatch``, type annotations are supported by
``dispatcher.register`` only since Python 3.7.

.. [1] https://docs.python.org/3.8/library/functools.html#functools.singledispatchmethod
.. [2] https://docs.python.org/3.8/glossary.html#term-single-dispatch
.. [3] https://docs.python.org/3.8/glossary.html#term-generic-function


