📜  使用 singledispatch-functools 进行函数重载

📅  最后修改于: 2022-05-13 01:55:42.661000             🧑  作者: Mango

使用 singledispatch-functools 进行函数重载

Single-dispatch泛型函数装饰器将函数转换为泛型函数,根据其第一个参数的类型,它可以具有不同的行为。装饰函数充当默认实现。要向函数添加重载实现,请使用泛型函数的register() 属性。它是一个装饰器,接受一个类型参数并装饰一个实现该类型操作的函数。

如果特定类型没有注册实现,则使用其方法解析顺序来查找更通用的实现。用@singledispatch修饰的原始函数是为基本对象类型注册的,这意味着如果没有找到更好的实现,则使用它。

from functools import singledispatch
  
@singledispatch
def fun(s):
    print(s)
  
@fun.register(int)
def _1(s):
    print(s * 2)
  
@fun.register(list)
def _2(s):
    for i, e in enumerate(s):print(i, e)
  
fun('GeeksforGeeks')
fun(10)
fun(['g', 'e', 'e', 'k', 's'])

输出 :

GeeksforGeeks
20
0 g
1 e
2 e
3 k
4 s

singledispatch 装饰器还支持装饰器堆叠。这允许我们创建一个可以处理多种类型的重载函数。例子 -

from functools import singledispatch
from decimal import Decimal
  
@singledispatch
def fun(s):
    print(s)
  
@fun.register(float)
@fun.register(Decimal)
def _3(s):
    print(round(s, 2))
  
fun(2.34)
fun(Decimal(4.897))

输出 :

2.34
4.90

dispatch() –检查泛型函数将为给定类型选择哪个实现。

print(fun.dispatch(dict))
print(fun.dispatch(list))

输出 :



registry() –用于访问所有已注册实现的只读属性。

print(fun.registry.keys())
print(fun.registry[int])
print(fun.registry[object])

输出 :

dict_keys([, , ])