Skip to main content
========
Overview
========

What is pygeneric?
==================

`pygeneric` implements generic functions based on type dispatch in Python. A generic
function groups different implementations (or methods) under the same name.
The actual implementation is then chosen at runtime depending on the type of
each function argument.

The implementation is loosely inspired in the Julia language. We also shamelessly
steal some other features of Julia and adapted them to Python:

* Parametric types.
* A type conversion/promotion system integrated with arithmetic operations.
* A generic Object base class that delegates all binary operations to the
corresponding generic functions (i.e., instead of implementing
Object.__add__, we overload ``generic.op.add(Object, Object))``.

This package works with Python 3 and Python 2, but it is getting increasingly
more difficult to keep Python 2 support as we implement more advanced features.
Not all functionality works in Python 2, and sometimes extra precautions
are necessary. Pygeneric cannot handle old style classes and sometimes we are
limited by lack of some Python 3 only syntax. Python 2 also have some quirks
that we do not try to emulate (e.g., broken comparison operators), so pygeneric
uses an uniform Python 3 semantics.


Basic usage
===========

Most of the functionality present in this package works around the type dispatch
in generic functions. We declare a generic function using the syntax

.. code-block:: python

from generic import generic, Number, Sequence

@generic
def func(x, y):
print('Got %r and %r' % (x, y))


Type dispatch can be defined in Python 3 as

.. code-block:: python

@func.overload
def func(x: Number, y: Number):
print('Got two numbers: %r and %r' % (x, y))


The Python 2-friendly syntax (which can also be useful in Python 3) is:

.. code-block:: python

@func.register(Sequence, Sequence)
def func(x, y):
print('Got two sequences: %r and %r' % (x, y))


Depending on the types of each argument, the dispatcher will choose either one
of these three implementations

>>> func(42, 0.0)
Got two numbers: 42 and 0.0
>>> func([1, 2], (3, 4))
Got two sequences: [1, 2] and (3, 4)
>>> func("foo", "bar")
Got two sequences: 'foo' and 'bar'


The type dispatch always chooses the most specialized method for the given
argument types.

Consider the two specialized dispatches

.. code-block:: python

from numbers import Integral

@func.overload
def func(x: Integral, y: Number):
print('Got one integer: %r and %s' % (x, y))

@func.overload
def func(x: Integral, y: Integral):
print('Got two integers: %r and %s' % (x, y))


``func`` knows what to do

>>> func(1, 2)
Got two integers: 1 and 2
>>> func(1, 2.0)
Got one integer: 1 and 2.0
>>> func(2.0, 1)
Got two numbers: 2.0 and 1


Further information
===================

Did you find this feature useful? Then start using pygeneric now!
Check the documentation__ for additional information.

.. __documentation:: http://pythonhosted.org/pygeneric/

Release files for pygeneric 0.5.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pygeneric 0.5.7
File Size Uploaded
pygeneric-0.5.7.tar.gz 146.3 kB Details

Release files / pygeneric-0.5.7.tar.gz

Download URL pygeneric-0.5.7.tar.gz
Size 146.3 kB
Tags Source
SHA-256 checksum
How to use checksums
418c3152c01302402b55def2b7004babcc64c71c0d35f6145cf0380202569eec
BLAKE2b-256 checksum
How to use checksums
85333a775c1c9af4919ee6d379169c240f1da8de2be8133eda7743b0936793e7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.5.7 This release

1 release file

0.5.6

1 release file

0.5.4

1 release file

0.5.3

1 release file

0.5.2

1 release file

0.5.1

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.3.0

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

1 release file

0.1.3

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page