gpt4 book ai didi

python - 派发请求时 Python if-elif-elif-elif 的最佳实践

转载 作者:太空狗 更新时间:2023-10-29 21:13:51 27 4
gpt4 key购买 nike

我有 5 组请求的类别定义为 python 字典,例如:

category1 = {'type1', 'type2', 'type3'}
category2 = {'type4', 'type5'}
category3 = {'type6', 'type7', 'type8', 'type9'}
category4 = {'type10', 'type11'}
category5 = {'type12', 'type13', 'type14'}

我需要使用他们的类别来处理请求,例如:

if request_type in category1:
# process category1 request
process_category1_request(...)
elif request_type in category2:
# process category2 request
process_category2_request(...)
elif...

我需要使用请求类型将请求分派(dispatch)给不同的函数来处理它。

我已经知道有一些方法可以在 Python 中分派(dispatch)此请求而无需使用 if-elif,但我的问题是:在保持代码简洁明了的同时执行此操作的最佳方法是什么?

最佳答案

如果 request_type 可以出现在多个类别中,您可以使用元组按优先级顺序遍历它们:

categories = (
(category1, dispatch1method),
(category2, dispatch2method),
(category3, dispatch3method),
(category4, dispatch4method),
(category5, dispatch5method),
)

next(method for cat, method in categories if request_type in cat)(arguments)

否则使用 dict() 将类别类型映射到分派(dispatch)方法;重用上面相同的元组映射来构建调度:

category_dispatch = {}
for cat, dispatch in categories:
category_dispatch.update(dict.fromkeys(cat.keys(), dispatch))

然后只需在上面查找请求类型:

category_dispatch[request_type](arguments)

这样的映射查找比扫描元组更快,后者我们必须依次测试每个类别,直到找到匹配项。

事实上,可以通过像这样反转相同的元组结构来维护优先级顺序:

category_dispatch = {}
for cat, dispatch in reversed(categories):
category_dispatch.update(dict.fromkeys(cat.keys(), dispatch))

从现在起,给定 request_type 键的最高优先级映射将最后输入到 category_dispatch 结构中。即使请求类型存在于多个类别中,这也会为您提供最快的调度。

缺点是,如果您的 category* 映射是动态的(随着时间的推移,请求类型会添加到不同类别或从不同类别中删除),您需要维护 category_dispatch 字典以反射(reflect)这些变化。

关于python - 派发请求时 Python if-elif-elif-elif 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14263427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com