summaryrefslogtreecommitdiff
path: root/README.rst
diff options
context:
space:
mode:
Diffstat (limited to 'README.rst')
-rw-r--r--README.rst167
1 files changed, 167 insertions, 0 deletions
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..802ab5e
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,167 @@
+==============
+singledispatch
+==============
+
+`PEP 443 <http://www.python.org/dev/peps/pep-0443/>`_ proposed to expose
+a mechanism in the ``functools`` standard library module in Python 3.4
+that provides a simple form of generic programming known as
+single-dispatch generic functions.
+
+This library is a backport of this functionality to Python 2.6 - 3.3.
+
+To define a generic function, decorate it with the ``@singledispatch``
+decorator. Note that the dispatch happens on the type of the first
+argument, create your function accordingly::
+
+ >>> from functools import singledispatch
+ >>> @singledispatch
+ ... def fun(arg, verbose=False):
+ ... if verbose:
+ ... print("Let me just say,", end=" ")
+ ... print(arg)
+
+To add overloaded implementations to the function, use the
+``register()`` attribute of the generic function. It takes a type
+parameter::
+
+ >>> @fun.register(int)
+ ... def _(arg, verbose=False):
+ ... if verbose:
+ ... print("Strength in numbers, eh?", end=" ")
+ ... print(arg)
+ ...
+ >>> @fun.register(list)
+ ... def _(arg, verbose=False):
+ ... if verbose:
+ ... print("Enumerate this:")
+ ... for i, elem in enumerate(arg):
+ ... print(i, elem)
+
+To enable registering lambdas and pre-existing functions, the
+``register()`` attribute can be used in a functional form::
+
+ >>> def nothing(arg, verbose=False):
+ ... print("Nothing.")
+ ...
+ >>> fun.register(type(None), nothing)
+
+The ``register()`` attribute returns the undecorated function which
+enables decorator stacking, pickling, as well as creating unit tests for
+each variant independently::
+
+ >>> @fun.register(float)
+ ... @fun.register(Decimal)
+ ... def fun_num(arg, verbose=False):
+ ... if verbose:
+ ... print("Half of your number:", end=" ")
+ ... print(arg / 2)
+ ...
+ >>> fun_num is fun
+ False
+
+When called, the generic function dispatches on the first argument::
+
+ >>> fun("Hello, world.")
+ Hello, world.
+ >>> fun("test.", verbose=True)
+ Let me just say, test.
+ >>> fun(42, verbose=True)
+ Strength in numbers, eh? 42
+ >>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
+ Enumerate this:
+ 0 spam
+ 1 spam
+ 2 eggs
+ 3 spam
+ >>> fun(None)
+ Nothing.
+ >>> fun(1.23)
+ 0.615
+
+To get the implementation for a specific type, use the ``dispatch()``
+attribute::
+
+ >>> fun.dispatch(float)
+ <function fun_num at 0x104319058>
+ >>> fun.dispatch(dict)
+ <function fun at 0x103fe4788>
+
+To access all registered overloads, use the read-only ``registry``
+attribute::
+
+ >>> fun.registry.keys()
+ dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
+ <class 'decimal.Decimal'>, <class 'list'>,
+ <class 'float'>])
+ >>> fun.registry[float]
+ <function fun_num at 0x1035a2840>
+ >>> fun.registry[object]
+ <function fun at 0x103170788>
+
+The vanilla documentation is available at
+http://docs.python.org/3/library/functools.html#functools.singledispatch.
+
+
+Versioning
+----------
+
+This backport is intended to keep 100% compatibility with the vanilla
+release in Python 3.4+. To help maintaining a version you want and
+expect, a versioning scheme is used where:
+
+* the first three numbers indicate the version of Python 3.x from which the
+ backport is done
+
+* a backport release number is provided after the last dot
+
+For example, ``3.4.0.0`` is the **first** release of ``singledispatch``
+compatible with the library found in Python **3.4.0**.
+
+A single exception from the 100% compatibility principle is that bugs
+fixed before releasing another minor Python 3.x.y version **will be
+included** in the backport releases done in the mean time. This rule
+applies to bugs only.
+
+
+Maintenance
+-----------
+
+This backport is maintained on BitBucket by Ɓukasz Langa, one of the
+members of the core CPython team:
+
+* `singledispatch Mercurial repository <https://bitbucket.org/ambv/singledispatch>`_
+
+* `singledispatch issue tracker <https://bitbucket.org/ambv/singledispatch/issues>`_
+
+
+Change Log
+----------
+
+3.4.0.0
+~~~~~~~
+
+* the first public release compatible with 3.4.0
+
+
+Conversion Process
+------------------
+
+This section is technical and should bother you only if you are
+wondering how this backport is produced. If the implementation details
+of this backport are not important for you, feel free to ignore the
+following content.
+
+``singledispatch`` is converted using `six
+<http://pypi.python.org/pypi/six>`_ so that a single codebase can be
+used for all compatible Python versions. Because a fully automatic
+conversion was not doable, I took the following branching approach:
+
+* the ``upstream`` branch holds unchanged files synchronized from the
+ upstream CPython repository. The synchronization is currently done by
+ manually copying the required code parts and stating from which
+ CPython changeset they come from. The tests should pass on Python 3.4
+ on this branch.
+
+* the ``default`` branch holds the manually translated version and this
+ is where all tests are run for all supported Python versions using
+ Tox.