【问题标题】:Turn if-elseif statements into dictionary将 if-elseif 语句变成字典
【发布时间】:2014-01-10 14:37: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 中处理 if / elseif 语句的正确方法是什么?

谢谢!

【问题讨论】:

    标签: python design-patterns dictionary switch-statement


    【解决方案1】:

    使用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 比较字符串是一个坏主意(尽管它是sometimes works);最好使用==:

    if request == 'get_id':
    

    【讨论】:

    • 在这里检查元组:headers=self.headers... 语法无效
    • 哇,这太酷了,只有几件事,function_dict(request) 应该是function_dict[request] 对吧?对于我的post 请求,我应该如何包含data=json.dumps(user)?我收到语法错误,将更新我的问题。
    • 不要单独存储函数和参数,只需使用lambda。这就是他们的目的!
    • @Tomcelic 是的,应该是[];固定的。 json.dumps 用于关键字参数data,因此应与headers 在字典中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多