将if-elseif语句转换为字典

 jzhs5340636 发布于 2023-02-04 16:33

我有以下代码用于对服务器进行RESTful调用:

def request(self, request, account_id, user):

    if request is 'get_id':
        #Get user from id
        result = requests.get(api_root + "/accounts/" + account_id + "/users/" + user, headers=self.headers)

    elif request is 'get_username':
        #Get user from username
        result = requests.get(api_root + "/accounts/" + account_id + "/users?username=" + user, headers=self.headers)

    elif request is 'get_email':
        #Get user from username
        result = requests.get(api_root + "/accounts/" + account_id + "/users?email=" + user, headers=self.headers)

    elif request is 'post':
        #Add user to new account
        result = requests.post(api_root + '/accounts/' + account_id + '/users', data=json.dumps(user), headers=self.headers)

    elif request is 'delete':
        #Delete user from account
        result = requests.delete(api_root + "/accounts/" + account_id + "/users/" + user, headers=self.headers)

    #Throw exception if non-200 response
    result.raise_for_status()

    #Print request result / status
    print "\nRequest " + request + " Result: " + result.text + "\nStatus: " + str(result.status_code)

    return result

我知道这很难看,我想把它改成字典,比如:

def request(self, request, account_id, user):
    url = api_root + "/accounts/" + account_id

    function_dictionary = {}
    function_dictionary['get_id']       = requests.get(url + "/users/" + user, headers=self.headers)
    function_dictionary['get_username'] = requests.get(api_root + "/accounts/" + account_id + "/users?username=" + user, headers=self.headers)
    function_dictionary['get_email']    = requests.get(api_root + "/accounts/" + account_id + "/users?email=" + user, headers=self.headers)
    function_dictionary['delete']       = requests.delete(url + "/users/" + user, headers=self.headers)
    function_dictionary['post']         = requests.post(url + '/users', data=json.dumps(user), headers=self.headers)  

    result = function_dictionary.get(request)

    #Throw exception if non-200 response
    result.raise_for_status()
    return result

我仍然有一种感觉,我会以错误的方式去做.任何人都可以告诉我,如果Python中的/ elseif语句是正确的方法吗?

谢谢!

1 个回答
  • 使用a dict替换if: elif:循环肯定是Pythonic,但请注意,在您的示例中,您为字典中存储的每个案例调用 requests.get等,即字典值是这些调用的结果.

    另一种方法是在字典中单独存储函数和参数:

    function_dict = {'get_id': (requests.get, # function
                                (url + "/users/" + user,), # tuple of arguments  
                                {'headers': self.headers}), # dict of keyword args
                     ...}
    

    现在你可以使用了

    func, args, kwargs = function_dict[request]
    result = func(*args, **kwargs)
    

    另外,请注意比较字符串使用is是一个坏主意(虽然它有时有效); 最好使用==:

    if request == 'get_id':
    

    2023-02-04 16:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有