自定义 singledispatch,如委托装饰器

Custom singledispatch like decorator for delegation

python 中是否有任何可用的实用程序可以满足我的需求?

假设我有这样的代码,

import config


def process_data(arg):
    if config.processor == 'x':
        return process_data_x(arg)

    if config.processor == 'y':
        return process_data_y(arg)

    raise NotImplementedError() 

我想表达成这样

@singledispatch_on_config(config.processor)  # or may be take a func
def process_data(arg):
    raise NotImplementedError()


@process_data.when('x')
def process_x(args):
    pass

@process_data.when('y')
def process_y(args):
    pass

任何现有的代码片段,如果不存在,我该如何编写它们?

这就是我到目前为止的想法,

class Dispatcher:
    def __init__(self, valgen, def_func):
        self.registry = {}
        self.valgen = valgen
        self.def_func = def_func

    def when(self, value):
        def dec(func):
            self.registry[value] = func
            return self
        return dec

    def __call__(self, *args, **kwargs):
        val = self.valgen()
        impl = self.registry.get(val, self.def_func)
        return impl(*args, **kwargs)


def cond_based_dispatcher(condition):
    def dec(func):
        return Dispatcher(condition, func)
    return dec


key_func = lambda: 3


@cond_based_dispatcher(key_func)
def example():
    print('example')


@example.when(1)
def example_1():
    print('example 1')


@example.when(2)
def example_2():
    print('example 2')

它“有效”,但如果手头的问题有任何其他更好的方法,我会很乐意改变它。