作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 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/
我是一名优秀的程序员,十分优秀!