Python 中的分派装饰器

2024 年 8 月 29 日 | 4 分钟阅读

装饰器是 Python 中的一个有用工具,因为它们可以修改函数的行为而不永久改变它。我们在 Python 装饰器教程中详细解释了装饰器。在本教程中,我们将学习调度装饰器及其基本实现。在深入研究之前,让我们看一个装饰器的简单示例。

示例 -

输出

Hello, Message Before Execution
We declare inside the function!!
Hello, Message After Execution

上面的代码是 Python 中普通装饰器的一个示例。

嵌套装饰器存在一些问题,如下所示。

  • 如果情况增多,装饰器会变得复杂难懂。为了复杂的实现,我们不得不牺牲装饰器的可读性。
  • 我们需要显式实现新情况。这排除了外部模块的可插入情况,并增加了精神负担。
  • 如果情况很复杂,整个事情就会变得很难理解。

现在,让我们了解一下调度装饰器与调度装饰器有何不同。

调度装饰器

调度装饰器或函数是基于签名或类型列表执行不同操作的机制。它用于根据签名、整数、字符串或数据类型列表在同一个抽象方法的不同实现之间进行选择。

众所周知,Python 是动态类型的,因此我们需要指定一个函数只接受某些精确的类型作为参数。

让我们理解下面的例子。

示例 -

输出

4
1.0
Hello Andrew!

解释 -

在上面的代码中,我们从 multipledispatch 模块导入了 dispatch 装饰器。@dispatch(int) 装饰器指定调度器 'func' 是值,并将其分配到命名空间(字典)中的第 i 个索引。这里出现了一个新术语命名空间,让我们看看命名空间是什么?

命名空间

命名空间是由调度装饰器使用的字典。调度装饰器与调度函数一起创建调度对象,并将该对象保存为键值对。调度装饰器使用此字典将函数映射为 Dispatcher('func')

命名空间在 multipledispatch.core.global_namespace 中用作全局命名空间。我们也可以使用字典创建自己的命名空间。让我们通过以下示例来理解。

示例 -

输出

4
1.0
{'func': <dispatched func>}

注意 - 要使用调度装饰器,我们需要使用以下命令安装 multiplesearch 模块。

单调度装饰器

单调度装饰器将一个函数转换为一个单调度泛函。当调用它时,它

  • 识别第一个参数的类型。
  • 检查其类型注册表。
  • 执行为其类型注册的函数。
  • 如果未注册该类型,则执行原始函数。

让我们通过以下示例更好地理解它的概念。

示例 -

输出

I am the default implementation.
'STRING' is a string.
1337 is an integer.
[1, 3, 3, 7] is a list.

它与其他装饰器不同,我们可以使用单调度函数做很多事情。

结论

本教程涵盖了装饰器的一种重要类型——调度装饰器。我们讨论了它的示例以及它与常规装饰器的区别。我们使用了 multipledispatch 和 functools 模块。我们需要使用 pip 命令安装 multipledispatch 模块。我们提到了一些调度器的基本示例,但它可以执行更复杂的任务。


下一个主题Python 中的内省