使用Python优雅的实现switch

https://www.zhihu.com/question/50498770?sort=created

优雅实现

运行效率不会变快, 但是代码容易维护

_registered_actions = {}

def action(name):
    def decorator(f):
        _registered_actions[name] = f
        return f
    return decorator

@action("getInfo")
def get_info(data):
    ...

@action("changeName")
def change_name(data):
    ...

def do_action(action_name, data):
    try:
        f = _registered_actions[action_name]
    except KeyError:
        return json.dumps(...)
    else:
        f(data)
        ...

2

在一个函数里用dict的{key:func}这种方式尚可,但用lambda 可读性就很惆怅了。。

另外这个dict建议放在类定义里,

首先在类定义里加上

    allow_methods={"method1","method2"} #构造一个集合

具体调用的时候

if func_name in self.allow_methods:
    func = getattr(self,"on_"+func_name)
    func(...)