Python中的函数模式/谓词匹配

Avi*_*ohn 6 python dynamic-dispatch libraries

我希望能够分派函数的不同实现,不仅基于第一个参数的类型,而且基于任意谓词.目前我必须这样做:

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.')
Run Code Online (Sandbox Code Playgroud)

这是我希望能够做到的精神:

@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
Run Code Online (Sandbox Code Playgroud)

它类似于Python 3 singledispatch,但singledispatch只支持对类型的调度,而不支持任意谓词.

TL; DR:是否有一个库允许基于任意谓词(不仅是参数的类型)的基于谓词的函数调度?

Avi*_*ohn 3

感谢各位的回复。在提出这个问题后,似乎没有现有的模块可以完全做到这一点。所以我自己写了:)它的灵感来自@Elazar的建议。

请随时查看。它位于 PyPI 上,您可以使用以下命令安装它:

pip install genericfuncs
Run Code Online (Sandbox Code Playgroud)

它也托管在 GitHub 上,我计划继续开发并添加功能,同时努力保持 API 简单。欢迎贡献。