class aritydispatch:
def __init__(self, default):
self.__default = default
self.__arities = {}
def __call__(self, *args, **kwargs):
f = self.__arities.get(len(args), self.__default)
return f(*args, **kwargs)
def register(self, n):
def decorator(f):
self.__arities[n] = f
return decorator
@aritydispatch
def f():
assert False
@f.register(1)
def _(a):
print(a)
@f.register(2)
def _(a, b):
print('{} {}'.format(a, b))
f(1, 2)
f(1)
f()
Y2xhc3MgYXJpdHlkaXNwYXRjaDoKCWRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0KToKCQlzZWxmLl9fZGVmYXVsdCA9IGRlZmF1bHQKCQlzZWxmLl9fYXJpdGllcyA9IHt9CgoJZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CgkJZiA9IHNlbGYuX19hcml0aWVzLmdldChsZW4oYXJncyksIHNlbGYuX19kZWZhdWx0KQoJCXJldHVybiBmKCphcmdzLCAqKmt3YXJncykKCglkZWYgcmVnaXN0ZXIoc2VsZiwgbik6CgkJZGVmIGRlY29yYXRvcihmKToKCQkJc2VsZi5fX2FyaXRpZXNbbl0gPSBmCgkJcmV0dXJuIGRlY29yYXRvcgoKQGFyaXR5ZGlzcGF0Y2gKZGVmIGYoKToKCWFzc2VydCBGYWxzZQoKQGYucmVnaXN0ZXIoMSkKZGVmIF8oYSk6CglwcmludChhKQoKQGYucmVnaXN0ZXIoMikKZGVmIF8oYSwgYik6CglwcmludCgne30ge30nLmZvcm1hdChhLCBiKSkKCmYoMSwgMikKZigxKQpmKCkK