Note Since Python 3.3 there’s functools.singledispatch() function which does the similar work in the standard library. We recommend you to use it instead of this. See also PEP 443.

It provides a simple and dirty way to define generic methods to existing types. You can make overloaded methods using this.

Compatibility TypeQuery does not depend on any non-standard libraries. It works on these environments: Python 2.5–2.7, 3.2–3.5

CPython, Stackless, PyPy, Jython

Install Install using pip : $ pip install TypeQuery

Example: JSON encoder from typequery import GenericMethod from sys import version_info from re import sub from numbers import Real from collections import Mapping, Iterable if version_info.major > 2: basestring = string = str else: string = unicode json = GenericMethod('json') @json.of(type(None)) def json(value): return 'null' @json.of(bool) def json(value): return 'true' if value else 'false' @json.of(Real) def json(value): return str(value) @json.of(string) def json(value): def escape(match): s = match.group(0) if s in ('\\', '"', '\b', '\f', '

', '\r', '\t'): return '\\' + s n = ord(s) if n < 0x10000: return r'\u%04x' % n n -= 0x10000 s1 = 0xd800 | ((n >> 10) & 0x3ff) s2 = 0xdc00 | (n & 0x3ff) return r'\u%04x\u%04x' % (s1, s2) return '"%s"' % sub(r'([\\"]|[^\ -~])', escape, value) @json.of(Iterable) def json(value): return '[%s]' % ', '.join(json(element) for element in value) @json.of(Mapping) def json(value): return '{%s}' % ', '.join('%s: %s' % (json(string(key)), json(value)) for key, value in value.items()) And defined json function works like: >>> json(123) '123' >>> json(True) 'true' >>> json({'apple': 3, 'banana': 5, 'carrot': 1}) '{"apple": 3, "banana": 5, "carrot": 1}' As the above shows, you can define type-aware instance methods to existing types even including ABCs like collections.Iterable .

Author and license Written by Hong Minhee. Distributed under MIT license. You can find the source code from the Bitbucket repository: $ hg clone https://bitbucket.org/dahlia/typequery