自定义类似于singledispatch的委托装饰器



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')

它";作品";,但是,如果有其他更好的方法来解决手头的问题,我很乐意改变它。

最新更新