2014-01-10 21 views
2

我有做一个RESTful调用服务器下面的代码:打开IF-ELSEIF语句转换成字典

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

    if request is 'get_id': 
     #Get user from id 
     result = requests.get(api_root + "/accounts/" + account_id + "https://stackoverflow.com/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 + "https://stackoverflow.com/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 + "https://stackoverflow.com/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 + "https://stackoverflow.com/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语句的正确方法是什么?

谢谢!

回答

8

使用dict更换if: elif:循环肯定是Python的,但要注意,在你的例子你调用requests.get等,为你在字典存储每一种情况下,即在字典中的值是这些调用的结果。

另一种方法是存储功能和参数分别在词典:

function_dict = {'get_id': (requests.get, # function 
          (url + "https://stackoverflow.com/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': 
+2

检查元组在这里:标题= self.headers ...无效语法 – ndpu

+0

啊,好点的,谢谢! – jonrsharpe

+0

哇这很酷,只是一些事情,'function_dict(request)'应该是'function_dict [request]'对吗?而对于我的'post'请求,我应该如何包含'data = json.dumps(user)'?我收到一个语法错误,将更新我的问题。 – TomSelleck