def singledispatch_example2(): # adapted from functools.singledispatch test case singledispatch = dispatch_on('arg') class S(object): pass class V(c.Sized, S): def __len__(self): return 0 @singledispatch def g(arg): return "base" @g.register(S) def g_s(arg): return "s" @g.register(c.Container) def g_container(arg): return "container" v = V() assert g(v) == "s" c.Container.register(V) # add c.Container to the virtual mro of V assert g(v) == "s" # since the virtual mro is V, Sized, S, Container return g, V
def singledispatch_example2(): # adapted from functools.singledispatch test case singledispatch = dispatch_on('arg') class S(object): pass class V(c.Sized, S): def __len__(self): return 0 @singledispatch def g(arg): return "base" @g.register(S) def g_s(arg): return "s" @g.register(c.Container) def g_container(arg): return "container" v = V() assert g(v) == "s" c.Container.register(V) # add c.Container to the virtual mro of V assert g(v) == "s" # since the virtual mro is V, Sized, S, Container return g, V
def singledispatch_example1(): singledispatch = dispatch_on('obj') @singledispatch def g(obj): raise NotImplementedError(type(g)) @g.register(collections.Sized) def g_sized(object): return "sized" @g.register(collections.Iterable) def g_iterable(object): return "iterable" g(C()) # RuntimeError: Ambiguous dispatch: Iterable or Sized?
def singledispatch_example1(): singledispatch = dispatch_on('obj') @singledispatch def g(obj): raise NotImplementedError(type(g)) @g.register(collections.Sized) def g_sized(object): return "sized" @g.register(collections.Iterable) def g_iterable(object): return "iterable" g(C()) # RuntimeError: Ambiguous dispatch: Iterable or Sized?
def test_no_first_arg(self): @decorator def example(*args, **kw): return args[0](*args[1:], **kw) @example def func(**kw): return kw # there is no confusion when passing args as a keyword argument self.assertEqual(func(args='a'), {'args': 'a'}) # ################### test dispatch_on ############################# # # adapted from test_functools in Python 3.5 singledispatch = dispatch_on('obj') class TestSingleDispatch(unittest.TestCase): def test_simple_overloads(self): @singledispatch def g(obj): return "base" @g.register(int) def g_int(i): return "integer" self.assertEqual(g("str"), "base") self.assertEqual(g(1), "integer") self.assertEqual(g([1, 2, 3]), "base")