Ad-hoc polymorphism is not supported in python programming language, maybe because weak type checking or something else, but many times I need to have ability to call a function in more than one way. So I should get arguments via **kwargs and implement a switch case like code to handle them.

This code implements the type of polymorphism that I need usually:

import inspect


def polymorphic(fn):
    @wraps(fn)
    def decorated_view(self, *args, **kwargs):
        functions = fn(self, *args, **kwargs)
        for function in functions:
            args = set(inspect.getargspec(function).args)
            if 'self' in args:
                args.remove('self')

            if args.issubset(set(kwargs.keys())):
                return function(self, **kwargs)

        return None

    return decorated_view


class MyClass(object):
    @polymorphic
    def __init__(self, *args, **kwargs):
        def by_pk(self, pk):
            self.load_with_pk(pk)

        def by_name(self, name):
        	self.load_with_name(name)

        return [by_pk, by_name]