编码从API

时间:2016-02-01 21:16:47

标签: python encoding

我正在与API通信,每次发送请求时,都会返回状态消息列表。我还有一个数据库,我用它来记录每个请求。我的db表为每个请求都有一行,我想要为返回的状态消息添加一列。 API可以返回总共15条消息,我正在考虑对它们进行编码,因此我不会存储我收到的所有消息的一个巨大字符串,如'message1 + message2 + message3 + message4 ......'

我知道我可以做类似下面的事情,所以我可以存储一个像'A,B,C,D ......'这样的字符串,但是有15个elif似乎没有很好的设计:

def request_sent(self,some_list):
    codeCombo = ''
    for message in some_list:
        code = self.get_log_code(message)
        codeCombo = codeCombo + ',' + code
    //store codeCombo in db

def get_log_code(status_message):

    if status_message == 'ORDER_COMPLETE':
        return 'A'
    elif status_message == 'ORDER_FAILED':
        return 'B'
    elif status_message == 'INSUFFICIENT_FUNDS':
        return 'C'
    elif status_message == 'SYSTEM_BUSY':
        return 'D'
    ...

有没有更好的方法来解决这个问题?

我很想知道二元方法是否有效。如果我有一个15位二进制值,其所有位最初设置为零。每个位代表一个状态消息。当状态消息出现时,它表示的位值将切换为1。

3 个答案:

答案 0 :(得分:1)

最简单快速的做法是将所有回复存储在词典中:

response_dict={'ORDER_COMPLETE':'A',
               'ORDER_FAILED':'B',
               'INSUFFICIENT_FUNDS':'C',
               'SYSTEM_BUSY':'D'}

您可以简单地将您的功能修改为:

def get_log_code(status_message):
    return response_dict[status_message]

答案 1 :(得分:0)

一种经典的方法是使用字典。

idx = pd.MultiIndex.from_product([df.Allotments.unique(), df.SH_Class.unique()],
                                 names=['Allotments', 'SH_Class'])

>>> df.set_index(['Allotments', 'SH_Class']).ix[idx].fillna(0).reset_index()
   Allotments  SH_Class  SH_Percent
0    A. Annex       BNW   16.187500
1    A. Annex      MTGP    1.000000
2    A. Annex    Meadow   39.687500
3    A. Annex       PHP   29.687500
4    A. Annex        SP   16.250000
5    A. Annex     WMTGP   10.833333
6    A. Annex  Woodland    5.000000
7    Arnstson       BNW    0.000000
8    Arnstson      MTGP    0.000000
9    Arnstson    Meadow   28.750000
10   Arnstson       PHP   61.590909
11   Arnstson        SP   18.125000
12   Arnstson     WMTGP    2.500000
13   Arnstson  Woodland   17.083333

如果有我们不知道的消息,请注意检查(messages = {'ORDER_COMPLETE' : 'A', 'ORDER_FAILED' : 'B', 'INSUFFICIENT_FUNDS': 'C', 'SYSTEM_BUSY' : 'D'} if status_message in messages: return messages[status_message] else: return '?' )。 API有一个讨厌的习惯,给出了无证信息。

答案 2 :(得分:0)

正是Greg K.所说的。您可以将它们存储为字典中的键/值对。

e.g:

errors = {
            "ORDER_COMPLETE": "A",
            "ORDER_FAILED": "B",
            "INSUFFICIENT_FUNDS": "C",
            "SYSTEM_BUSY": "D"
}

def get_log_code(status_message):
    return errors[status_message]