What if there was a general mechanism to allow operators to be implemented by user code that does not belong to the class? If the name [e.g.] __operatorhook_or__ is defined anywhere in a module, within that module all calls to that operator are replaced with a two-step process: call __operatorhook_or__(dict1, dict2) if it returns a value, use that value if it returns NotImplemented use the ordinary operator lookup process, i.e. dict1.__or__ and dict2.__ror___ [if __operatorhook_or__ is not defined, treat the same as if it had returned NotImplemented] Then a user could simply do: def __operatorhook_or__(obj1, obj2): if isinstance(obj1, dict) and isinstance(obj2, dict): return {**obj1, **obj2} return NotImplemented def __operatorhook_ior__(obj1, obj2): if isinstance(obj1, dict): obj1.update(obj2) return obj1 return NotImplemented