class AttrWalker(object): def __init__(self): self.applymm = MultiMethod(lambda *a, **kw: (a[1], )) self.createmm = MultiMethod(lambda *a, **kw: (a[1], )) def add_creator(self, *types): def _dec(fun): for type_ in types: self.createmm.add(fun, (type_, )) return fun return _dec def add_applier(self, *types): def _dec(fun): for type_ in types: self.applymm.add(fun, (type_, )) return fun return _dec def add_converter(self, *types): def _dec(fun): for type_ in types: self.applymm.add(self.cv_apply(fun), (type_, )) self.createmm.add(self.cv_create(fun), (type_, )) return fun return _dec def cv_apply(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.applymm(*args, **kwargs) return _fun def cv_create(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.createmm(*args, **kwargs) return _fun def create(self, *args, **kwargs): return self.createmm(self, *args, **kwargs) def apply(self, *args, **kwargs): return self.applymm(self, *args, **kwargs) def super_create(self, *args, **kwargs): return self.createmm.super(self, *args, **kwargs) def super_apply(self, *args, **kwargs): return self.applymm.super(self, *args, **kwargs)
class AttrWalker(object): def __init__(self): self.applymm = MultiMethod(lambda *a, **kw: (a[1],)) self.createmm = MultiMethod(lambda *a, **kw: (a[1],)) def add_creator(self, *types): def _dec(fun): for type_ in types: self.createmm.add(fun, (type_,)) return fun return _dec def add_applier(self, *types): def _dec(fun): for type_ in types: self.applymm.add(fun, (type_,)) return fun return _dec def add_converter(self, *types): def _dec(fun): for type_ in types: self.applymm.add(self.cv_apply(fun), (type_,)) self.createmm.add(self.cv_create(fun), (type_,)) return fun return _dec def cv_apply(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.applymm(*args, **kwargs) return _fun def cv_create(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.createmm(*args, **kwargs) return _fun def create(self, *args, **kwargs): return self.createmm(self, *args, **kwargs) def apply(self, *args, **kwargs): return self.applymm(self, *args, **kwargs) def super_create(self, *args, **kwargs): return self.createmm.super(self, *args, **kwargs) def super_apply(self, *args, **kwargs): return self.applymm.super(self, *args, **kwargs)
def test_super(): class String(str): pass mm = MultiMethod(lambda *a: a) with pytest.raises(TypeError): mm.super() @mm.add_dec(str, str) def foo(foo, bar): return 'String' # Suppress pep8 warning "F811 redefinition of unused 'foo' ..." @mm.add_dec(String, str) def foo(foo, bar): return 'Fancy', mm.super(super(String, foo), bar) assert mm('foo', 'bar') == 'String' assert mm(String('foo'), 'bar') == ('Fancy', 'String')
def test_super(): class String(str): pass mm = MultiMethod(lambda *a: a) with pytest.raises(TypeError): mm.super() @mm.add_dec(str, str) def foo(foo, bar): return 'String' # Suppress pep8 warning "F811 redefinition of unused 'foo' ..." @mm.add_dec(String, str) # noqa def foo(foo, bar): return 'Fancy', mm.super(super(String, foo), bar) assert mm('foo', 'bar') == 'String' assert mm(String('foo'), 'bar') == ('Fancy', 'String')