def register(self, key, *types): key = getattr(key, "__origin__", key) register = self.registry[key].register if self.default: objects = (object,) * len(types) try: if objects != types and supercedes(types, objects): register(*objects)(self.default) except TypeError: pass # mysterious source of ambiguity in Python 3.5 breaks this # This decorator supports stacking multiple decorators, which is not # supported by multipledipatch (which returns a Dispatch object rather # than the original function). def decorator(fn): register(*types)(fn) return fn return decorator
def test_supercedes(): assert supercedes([B], [A]) assert supercedes([B, A], [A, A]) assert not supercedes([B, A], [A, B]) assert not supercedes([A], [B])
def _test_supercedes(a, b): assert supercedes(a, b) assert not supercedes(b, a)