我正在与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。
答案 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]