在Python中的调度装饰器

在Python中的调度装饰器

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

示例

# defining a decorator
def message_decorator(func):
    # The inner function can access the outer local
    def inner():
        print("Hello, Message before Execution")

        # Here we are calling the actual function
        # inside the wrapper function.
        func()
        print("Hello, Message After Execution")

    return inner

# We define a function, to be called inside wrapper
def new_function():
    print("We declare inside the function !!")


# Now we pass 'new_function()' inside the
# decorator to control its behavior
new_function = message_decorator(new_function)

# calling the function
new_function()

输出:

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

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

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

  • 如果情况数量增加,装饰器的理解变得复杂。我们不得不在复杂的实现中对装饰器的可读性做出妥协。
  • 我们必须明确实现新的情况。这排除了来自外部模块的可插拔案例,也增加了心理负担。
  • 如果情况复杂,整个事情很快变得难以理解。

现在,让我们了解分派装饰器与分派装饰器的区别。

分派装饰器

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

正如我们所知,Python是动态类型语言,因此我们需要指定函数只接受某些精确类型的参数。

让我们来了解以下示例。

示例

from multipledispatch import dispatch
@dispatch(int)
def func(x):
    return x * 2

@dispatch(float)
def func(x):
    return x / 2

@dispatch(str)
def func(x):
    return 'Hello' + n + '!'
print(func(2))
print(func(2.0))
print(func('Andrew'))

输出:

4
1.0
Hello Andrew!

解释 –

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

Namespace

命名空间是一个由dispatch装饰器使用的字典。dispatch装饰器创建了分派对象以及分派函数,并将对象保存为键值对。dispatch装饰器使用这个字典将一个函数映射为Dispatcher(‘func’)。

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

示例

from multipledispatch import dispatch
new_namespace = {}

@dispatch(int, namespace = new_namespace)
def func(x):
    return x * 2

@dispatch(float, namespace = new_namespace)
def func(x):
    return x / 2

# Driver code
print(func(2))
print(func(2.0))
print(new_namespace)

输出:

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

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

pip install multipledispatch

单分派装饰器

单分派装饰器将一个函数转换为单分派通用函数。当调用它时,会执行以下步骤:

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

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

示例:

from functools import singledispatch

singledispatch
def dispatch_on_type(x):
    # some default logic
    print("The default function implementation.")

@dispatch_on_type.register(str)
def _(x):
    # some stringy logic
    print(f"'{x}' is a string.")

@dispatch_on_type.register(int)
def _(x):
    # some integer logic
    print(f"{x} is an integer.")

@dispatch_on_type.register(list)
def _(x):
    # some list logic
    print(f"{x} is a list.")

dispatch_on_type(set())
dispatch_on_type("Marry")
dispatch_on_type(1337)
dispatch_on_type([1,3,3,7])

输出:

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

它与其他装饰器不同,我们可以使用单个调度函数来完成许多事情。

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程