自 python 3.7 发布以来,可以使用functools.singledispatch
.
from functools import singledispatch
@singledispatch
def greet(arg: object):
raise NotImplementedError(f"Don't know how to greet {type(arg)}")
@greet.register
def _(arg: str):
print(f"Hello, {arg}!")
@greet.register
def _(arg: int):
print(', '.join("Hello" for _ in range(arg)), "!")
greet("Bob") # string implementation is called — prints "Hello, Bob!"
greet(4) # int implementation is called — prints "Hello, Hello, Hello, Hello!"
greet(["Alice, Bob"]) # no list implementation, so falls back to the base implementation — will raise an exception
在上面的示例中,注册了一个将 raise 的基本实现NotImplementedError
。如果其他实现都不适合,这是返回的“后备”实现。
在基本实现的定义之后,可以注册任意数量的特定于类型的实现,如示例所示 - 函数的行为完全不同,具体取决于提供给它的参数的类型,并且该@singledispatch
方法使用类型注释用某个 .注册某个函数的某个实现type
。
一个singledispatch
函数可以有任意数量的参数,但只有第一个参数的类型注释与调用哪个实现相关。