a = {
'binance':['btc'],
'coinbase':['btcusd,btcusdt']
}
b = {
'coinbase':['eth']
'binance':['ethusd']
}
c = {
'coinbase':1,
'binance':2
}
这里只是一个简单的例子,真正的例子非常复杂,处于各种原因 a,b 中记载了各种无序 symbol ,出于其他要求 a b 里面的顺序和数据是不一样的,c 中记载了所有 gateway 的 sort。
现在有一个要求就是在数据库列表中将相同 coin 的币种根据 c 的顺序递增的排列。
coin
coin 的意思就是币种,对于 a 来说 coin 是 btc ,对于 b 来说 coin 是 eth。
举个例子
a 中的例子顺序应该是 coinbase: btcusd->1 | btcusdt-> 2 | binance: btc->3
因为 a 或者 b 的元素非常的多,如果按照我之前的编写代码的模式,我会大量使用 for
比如
1 2 3 4 5 6 7
# 使用 i 暂存币种的顺序 i = 0 for gateway,symbols in a.items(): for symbol in symbols.split(','): for _gateway,sort in c.items(): if gateway == _gateway: i += 1
这里面用了 3 个 for 循环,但是,根据我的项目需求,这样写的话,我还得再嵌套 3 个 for 循环,最后是 6 个 for 循环。
稍微有点知识的人就知道这个代价是非常惨重的。
所以,我们为什么不事先把顺序先存起来呢?
主要利用的是下面的这个结构体
dict
因为上面的某些排列具有唯一性,及
binance.btc | coinbase.eth
所以我们使用一个 dict 将数据预先处理,存起来
dict[coin][gateway_symbol] = sort_number
coin : 币种信息 btc
gateway_symbol : binance.btc
sort_number : 排列顺序
然后,我们想要取那个固定的 symbol 的 sort_number 的时候只需要
dict[coin].get(gateway + '.' + symbol)
工厂模式
由于,我们的环境是两个
测试
正式
所以,我们的代码如下
1 2 3 4 5 6 7 8 9 10
t = 'test' if t == 'official': dockersql = DockerSql(symbol, instance_id=instance_id, key_type=symbol) dockersql.key_type = symbol else: dockersql = DockerSql(symbol, instance_id=instance_id, key_type='test')