这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:
from functools import singledispatch
@singledispatch
def fun(arg, verbose=False):
'''如果没有合适的函数,就调用这个函数'''
if verbose:
print('Let me just say,', end=' ')
print(arg)
#把register当做修饰器使用,为不同类型参数分别创建不同的实现
#使用下划线表示不关心函数的具体名字
@fun.register(int)
def _(arg, verbose=False):
'''如果第一个参数的类型是int,就调用这个函数'''
if verbose:
print('Strength in numbers, eh?', end=' ')
print(arg)
#也可以为函数起个名字
@fun.register(float)
def fun_num(arg, verbose=False):
'''如果第一个参数的类型是float,就调用这个函数'''
if verbose:
print('Half of your number is:', end=' ')
print(arg/2)
@fun.register(list)
@fun.register(tuple)
def _(arg, verbose=False):
'''如果第一个参数的类型是list或tuple,就调用这个函数'''
if verbose:
print('Enumerate this:')
for i, v in enumerate(arg):
print(i, v)
#自定义类
class Scores:
def __init__(self, *score):
self.score = list(score)
#为自定义类型创建泛型函数
@fun.register(Scores)
def _(arg, verbose=False):
if verbose:
print('The scores are:')
for sc in arg.score:
print(sc, end=' ')
#如果第一个参数是None的类型,就调用这个函数
def doNothing(arg, verbose=False):
print('Nothing to do.')
#可以把register()当做函数使用来注册指定类型
fun.register(type(None), doNothing)
#调用原始函数
fun('Hello world.')
#调用针对整型参数的函数
fun(666, True)
#调用针对实型参数的函数
fun(6.66)
#调用针对列表和元组参数的函数
fun(list(range(5, 10)))
fun(tuple(range(10, 15)))
#调用针对None类型参数的函数doNothing()
fun(None)
#调用原始函数
fun({1,2,3},True)
#调用针对自定义类型Scores参数的函数
fun(Scores(1, 2, 3, 4, 5))