Python字典调度模式
Python编程语言中我最喜欢的模式之一是“dictionary dispatch”模式。当您有一个字典,其中包含字符串键和函数作为值时,就会出现这种模式。然后可以简洁地调用这些函数。如果您有一系列可以应用不同值的函数,并且这些函数都接受(大约)相同的参数,那么这将非常有用。
请考虑以下代码:
# !usr/bin/python3
# -*- coding:UTF-8 -*-
math_exprs = {
"add": lambda x, y: x + y,
"subtract": lambda x, y: x - y,
"multiply": lambda x, y: x * y,
...
}
要运行数学表达式,我可以使用:
math_exprs["add"](1, 2)
math_exprs["subtract"](1, 2)
...
API——从字典中检索项,然后直接调用函数——在所有表达式中都是相同的。当解析可能需要指向多个位置之一的用户输入时,或者当解析语法树时,这尤其有用。
请考虑VisionScript编程语言的一部分:
SUPPORTED_INFERENCE_MODELS = {
"groundingdino": lambda self, classes: registry.grounding_dino_base(self, classes),
"yolov8": lambda self, classes: registry.yolov8_base(self, classes),
...
}
此字典将模型名称映射到一个匿名函数,该函数调用不同文件中的函数。我用它来确定什么函数应该为开发人员处理模型推理。我可以使用上面的字典调度模式,而不是有一个if语句,它的大小会随着我向字典中添加更多的模型而增加,并且变得更难阅读。
要调用模型,我使用:
results, inference_classes, classes = SUPPORTED_INFERENCE_MODELS[model](
self, classes
)
这里,model是模型的名称(字典中的关键字)。我直接用括号语法调用字典返回的函数,传递它所需的值(在本例中为self,它包含语言的全局状态和类)。所有函数都返回三个标准值。
我非常喜欢这种模式。我在Python中实现自己的Lisp时使用过它,用于将VisionScript中的令牌类型映射到它们的关联函数,用于将模型映射到VisionScript中处理该模型推理的函数等等。