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

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