发送请求时Python ifelifelifelif的最佳实践

2024-09-28 01:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

我需要使用请求类型将请求发送到另一个函数来处理它。在

我已经知道在Python中有一些不需要使用if-elif的方法来调度这个请求,但是我的问题是:在保持代码干净和简单的同时,最好的方法是什么?在


Tags: 方法定义类别dictstype1category2category1type2
3条回答

我认为最干净的可能是两个映射,以使代码更具可读性。在

type_category_map = {"type1" : "category1", 
"type2" : "category1", , 
"type3" : "category1",
"type4" : "category2",
....
"type14" : "category5"}

category_function_map = {"category1" : "handler1_function",
"category2" : "handler2_function,
....
}

那么python就是这样:

^{pr2}$

有一些方法可以用一个单一的数据结构来实现,但我认为没有一种方法能像这样清晰易懂。在

将类别映射到处理程序。不受地图大小的影响 O(1)进入时间。在

MAP = {
  'cat1': handler1,
  'cat2': handler2,
   ....
}

MAP[request_type](...)

如果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()将类别类型映射到分派方法;重用上面相同的元组映射来构建分派:

^{pr2}$

然后查找请求类型:

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_dispatchdict来反映这些更改。在

相关问题 更多 >

    热门问题