自定义 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')
它“有效”,但如果手头的问题有任何其他更好的方法,我会很乐意改变它。
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')
它“有效”,但如果手头的问题有任何其他更好的方法,我会很乐意改变它。