在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的基本示例,但它可以执行更复杂的任务。