Python if-else一团糟

时间:2017-11-24 00:19:14

标签: python python-3.x dictionary if-statement

是否有更简洁的方式来创建msg?对于每个事件(Ping,Pull请求,Issue,Issue comment,Repo,Create,Delete,Pull requset review,Push,Commit comment)都有一个if子句,用于检查事件并根据事件的动作创建消息。

    data = request.json
    event = request.headers['X-Github-Event']
    msg = ""

    ...

   # Pull request
   elif event == "pull_request":
       if data['action'] == "opened":
           msg = PullRequest(data).opened()
       elif data['action'] == "closed":
           msg = PullRequest(data).closed()
       elif data['action'] == "assigned":
           msg = PullRequest(data).assigned()

   # Issue
   elif event == "issues":
        if data['action'] == "opened":
            msg = Issue(data).opened()
        elif data['action'] == "reopened":
            msg = Issue(data).reopened()
        elif data['action'] == "closed":
            msg = Issue(data).closed()
        elif data['action'] == "labeled":
            msg = Issue(data).labeled()
        elif data['action'] == "assigned":
            msg = Issue(data).assigned()
    ...

1 个答案:

答案 0 :(得分:2)

如何动态地这样做,例如

getattr(PullRequest(data), data['action'], lambda:None)()

总结

elif event == "pull_request":
    getattr(PullRequest(data), data['action'], lambda:None)()
elif event == "issues":
    getattr(Issue(data), data['action'], lambda:None)()

lambda:None背后的想法是,如果data['action']实际上不是PullRequest(data)Issue(data)的方法,则代表默认可调用。

或者如果您不喜欢if-else语句,例如

callables = {
    "pull_request":PullRequest,
    "issues":Issue,
}

getattr(callables[event](data), data['action'], lambda:None)()