CodeWalk

Python 中 functools.singledispatch 泛型函数

作者:编译有声 · 2026-05-30 12:55

functools.singledispatch 的作用是什么?如何实现参数类型不同的多分派函数?

回答

编译有声

singledispatch 创建泛型函数,根据第一个参数的类型进行分派,实现类似方法重载的效果。

from functools import singledispatch

@singledispatch
def process(data):
    raise NotImplementedError(f'Unsupported type: {type(data)}')

@process.register(int)
def _(data):
    return f'Integer: {data * 2}'

@process.register(str)
def _(data):
    return f'String: {data.upper()}'

@process.register(list)
@process.register(tuple)
def _(data):
    return f'Sequence: {len(data)} items'

print(process(42))        # Integer: 84
print(process('hello'))   # String: HELLO
print(process([1, 2, 3])) # Sequence: 3 items
print(process({1, 2}))    # NotImplementedError

特性

  1. 只根据第一个参数类型分派
  2. 支持注册到基类,isinstance 匹配
  3. 可查看所有注册:process.registry
  4. 支持 @process.register(dict) 装饰器语法

如果需要多参数分派,可以使用 multimethodplum 库。