如何根据传递给函数的数据类型分派 Python 2 函数?

thi*_*ybk 2 python generic-function single-dispatch python-2.7

我想根据传递给“调度”函数(例如使用)的参数的数据类型来调度 Python 函数(例如使用dict 方法isinstance())。是否有实施替代方案?最简单的方法是什么?

Mar*_*ers 6

从 Python 3.4 开始,Python 标准库包括对@singledispatch()泛型函数的支持。

这使您可以注册多个函数来处理不同的类型,并且它将处理基于类型的调度,包括子类测试和缓存。该方法在PEP 443 - Single-dispatch generic functions 中描述

PyPI 上有一个支持 Python 2.6 及更高版本的backport,由 PEP 作者编写。

请注意,Python 2.7 很快将迎来最后的生命周期终止日期,届时它将不再收到错误修复和安全更新;您确实需要尽快计划升级到 Python 3。当您这样做时,您会注意到 Python 3.7 版本支持使用类型提示来记录每个函数接受的类型。

例如,一系列用于从嵌套字典和列表数据结构(典型的 JSON 数据结构)中删除NoneFalse取值的函数,可以定义为:

from functools import singledispatch

@singledispatch
def remove_null_false(ob):
    return ob

@remove_null_false.register
def _process_list(ob: list):
    return [remove_null_false(v) for v in ob]

@remove_null_false.register
def _process_list(ob: dict):
    return {k: remove_null_false(v) for k, v in ob.items()
            if v is not None and v is not True and v is not False}
Run Code Online (Sandbox Code Playgroud)

在 Python 版本 < 3.7 中,您必须将类型移动到@remove_null_false.register(...)装饰器工厂表示法。