def test_dispatch_lazy_walks_mro(): """Check that subclasses of classes with lazily registered handlers still use their parent class's handler by default""" import decimal class Lazy(decimal.Decimal): pass class Eager(Lazy): pass foo = Dispatch() @foo.register(Eager) def eager_handler(x): return "eager" def lazy_handler(a): return "lazy" @foo.register_lazy("decimal") def register_decimal(): foo.register(decimal.Decimal, lazy_handler) assert foo.dispatch(Lazy) == lazy_handler assert foo(Lazy(1)) == "lazy" assert foo.dispatch(decimal.Decimal) == lazy_handler assert foo(decimal.Decimal(1)) == "lazy" assert foo.dispatch(Eager) == eager_handler assert foo(Eager(1)) == "eager"
def test_dispatch(): foo = Dispatch() foo.register(int, lambda a: a + 1) foo.register(float, lambda a: a - 1) foo.register(tuple, lambda a: tuple(foo(i) for i in a)) foo.register(object, lambda a: a) class Bar(object): pass b = Bar() assert foo(1) == 2 assert foo.dispatch(int)(1) == 2 assert foo(1.0) == 0.0 assert foo(b) == b assert foo((1, 2.0, b)) == (2, 1.0, b)
def test_dispatch_lazy(): # this tests the recursive component of dispatch foo = Dispatch() foo.register(int, lambda a: a) import decimal # keep it outside lazy dec for test def foo_dec(a): return a + 1 @foo.register_lazy("decimal") def register_decimal(): import decimal foo.register(decimal.Decimal, foo_dec) # This test needs to be *before* any other calls assert foo.dispatch(decimal.Decimal) == foo_dec assert foo(decimal.Decimal(1)) == decimal.Decimal(2) assert foo(1) == 1
def test_dispatch(): foo = Dispatch() foo.register(int, lambda a: a + 1) foo.register(float, lambda a: a - 1) foo.register(tuple, lambda a: tuple(foo(i) for i in a)) def f(a): """ My Docstring """ return a foo.register(object, f) class Bar(object): pass b = Bar() assert foo(1) == 2 assert foo.dispatch(int)(1) == 2 assert foo(1.0) == 0.0 assert foo(b) == b assert foo((1, 2.0, b)) == (2, 1.0, b) assert foo.__doc__ == f.__doc__