我希望能够调度函数的不同实现,不仅基于第一个参数的类型,而且基于任意谓词。目前我必须这样做:
def f(param):
try:
if param > 0:
# do something
except TypeError:
pass
try:
if all(isinstance(item, str) for item in param):
# do something else
except TypeError:
raise TypeError('Illegal input.')
以下是我希望能够做的事情的精神:
@generic
def f(param):
raise TypeError('Illegal input.') # default
@f.when(lambda param: param > 0)
def f_when_param_positive(param):
# do something
@f.when(lambda param: all(isinstance(item, str) for item in param))
def f_when_param_iterable_of_strings(param):
# do something else
它类似于 Python 3 的singledispatch
,但singledispatch
仅支持对类型进行分派,而不支持对任意谓词进行分派。
TL;DR:是否有一个库允许基于任意谓词(不仅是参数的类型)对函数进行基于谓词的调度?