Python 中 functools.singledispatch 泛型函数
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
特性:
- 只根据第一个参数类型分派
- 支持注册到基类,
isinstance匹配 - 可查看所有注册:
process.registry - 支持
@process.register(dict)装饰器语法
如果需要多参数分派,可以使用 multimethod 或 plum 库。