根据第一个参数的类型,以不同方式执行相同操作的一组函数。在 python
里,使用 @singledispatch
装饰的普通函数会变成泛函数(generic function)。
当然,如果根据多个参数选择专门的函数,那就是多分派了。这里不介绍。
这是官方的demo:
- 要定义一个泛型函数,应使用
@singledispatch
装饰器进行装饰。 请注意分派是作用于第一个参数的类型,要相应地创建你的函数:
from functools import singledispatch
@singledispatch
def fun(arg, verbose=False):
if verbose:
print("Let me just sqy, ", end=" ")
print(arg)
- 要将重载的实现添加到函数中,请使用泛型函数的
register()
属性。 它是一个装饰器。 对于带有类型标注的函数,该装饰器将自动推断第一个参数的类型:
@fun.register
def _(arg: int, verbose=False):
if verbose:
print("Strength in numbers, eh?", end=" ")
print(arg)
@fun.register
def _(arg: list, verbose=False):
if verbose:
print("Enumerate this:")
for k, v in enumerate(arg):
print(k, v)
- 对于不使用类型标注的代码,可以将适当的类型参数显式地传给装饰器本身:
@fun.register(int)
def _(arg, verbose=False):
if verbose:
print("Strength in numbers, eh?", end=" ")
print(arg)
@fun.register(list)
def _(arg, verbose=False):
if verbose:
print("Enumerate this:")
for k, v in enumerate(arg):
print(k, v)
- 在调用时,泛型函数会根据第一个参数的类型进行分派:
if __name__ == '__main__':
fun(1, verbose=True)
fun([1, 2, 4], verbose=True)
fun(1.01, verbose=True)
代码执行结果:
Strength in numbers, eh? 1
Enumerate this:
0 1
1 2
2 4
Let me just sqy, 1.01
从结果上可以看到,当有定义其类型的函数时,会执行对应的方法 _
,否则直接执行 fun
方法。
在平时的业务开发中,可以应用在对不确定类型变量时,需要执行不同的业务流程, 这只是其中一种场景。
参考书籍:
Fluent Python
Original: https://blog.csdn.net/qsloony/article/details/123756617
Author: keyson R
Title: python-单分派泛函数(singledispatch)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/745841/
转载文章受原作者版权保护。转载请注明原作者出处!