[Python-Dev] PEP 443 - Single-dispatch generic functions (including ABC support)

PJ Eby pje at telecommunity.com
Tue May 28 23:27:17 CEST 2013


On Tue, May 28, 2013 at 3:41 PM, Russell E. Owen <rowen at uw.edu> wrote:
> Is it true that this cannot be used for instance and class methods? It
> dispatches based on the first argument, which is "self" for instance
> methods, whereas the second argument would almost certainly be the
> argument one would want to use for conditional dispatch.

You can use a staticmethod and then delegate to it, of course.  But it
probably wouldn't be too difficult to allow specifying which argument
to dispatch on, e.g.:

    @singledispatch.on('someArg')
    def my_method(self, someArg, ...):
          ...

The code would look something like this:

    def singledispatch(func, argPosn=0):
        ...
        # existing code here...
        ...
        def wrapper(*args, **kw):
            return dispatch(args[argPosn].__class__)(*args, **kw)  #
instead of args[0]

    def _dispatch_on(argname):
        def decorate(func):
            argPosn = # code to find argument position of argname for func
           return dispatch(func, argPosn)
        return decorate

    singledispatch.on = _dispatch_on

So, it's just a few lines added, but of course additional doc, tests,
etc. would have to be added as well.  (It also might be a good idea
for there to be some error checking in wrapper() to raise an
approriate TypeError if len(args)<=arg.)


More information about the Python-Dev mailing list