@singledispatch
def connect(address):
print(f’ 传输参数类型为:{type(address)},不是有效类型’)

@connect.register
def _(address: str):
ip, port = address.split(‘:’)
print(f’参数为字符串,IP是:{ip}, 端口是:{port}')

@connect.register
def _(address: tuple):
ip, port = address
print(f’参数为元组,IP是:{ip}, 端口是:{port}')

connect(‘123.45.32.18:8080’)
connect((‘123.45.32.18’, 8080))
connect(123)

我们运行一下这段代码,大家看看根据参数的不同,有什么样的不同效果:


![]()


可以看到,我们调用的函数,始终都是`connect`,但是由于传入参数的类型不同,它运行的结果也不一样。


我们使用`singledispatch`装饰一个函数,那么这个函数就是我们将会调用的函数。


这个函数在传入参数不同时的具体实现,通过下面注册的函数来实现。注册的时候使用`@我们定义的函数名.register`来注册。被注册的函数名叫什么无关紧要,所以这里我都直接使用下划线代替。


被注册的函数的第一个参数,通过类型标注来确定它应该使用什么类型。当我们调用我们定义的函数时,如果参数类型符合某个被注册的函数,那么就会执行这个被注册的函数。如果参数类型不满足任何一个被注册的函数,那么就会执行我们的原函数。


使用类型标注来指定参数类型是从 Python 3.7才引入的新特性。在 Python 3.6或之前的版本,我们需要通过`@我们定义的函数名.register(类型)`来指定类型,例如:

from functools import singledispatch

@singledispatch
def connect(address):
print(f’ 传输参数类型为:{type(address)},不是有效类型’)

@connect.register(str)
def _(address):
ip, port = address.split(‘:’)
print(f’参数为字符串,IP是:{ip}, 端口是:{port}')

@connect.register(tuple)
def _(address):
ip, port = address
print(f’参数为元组,IP是:{ip}, 端口是:{port}')