Я пишу программу, в которой требуется функция для отслеживания смоделированной стоимости нескольких различных валютных кошельков на нескольких биржах.Я написал класс для объявления, хранения и извлечения смоделированного баланса:
>>> class Balance:
def __init__(self,exchange,currency):
self.exchange = exchange
self.currency = currency
def update(self,val):
self.val = val
def get(self):
qty = self.val
if qty > 0:
return qty
else:
return False
На каждый объект «Хранитель баланса» ссылается currency_exchange
, как показано ниже.При объявлении объекта вручную все работает нормально:
>>> BTC_poloniex=Balance('poloniex','BTC')
>>> BTC_poloniex.update(5.5)
>>> BTC_poloniex.get()
5.5
>>> XMR_poloniex=Balance('poloniex,'XMR')
>>> XMR_poloniex.update(11)
>>> XMR_poloniex.get()
11
Однако я хотел бы перебрать следующие списки, динамически объявить объекты и присвоить значения следующим образом:
>>> CURRENCIES=['BTC','ETH','XRP','XLM','NEO','DASH','XMR','LSK','ZEC','LTC','ETC', 'ADA', 'XMR']
>>> BALANCES = [("BTC", 5.0), ("DASH", 10.0), ("ETH", 10.0), ("XRP", 100.0), ("XLM", 1000.0), ("NEO", 100.0), ("XMR", 10.0), ("LSK", 1000.0), ("ZEC", 10.0), ("LTC", 20.0), ("ETC", 20.0), ("ADA", 1000.0)]
>>> EXCHANGES=["poloniex", "cex", "bittrex", "binance", "okex"]
>>> for ex in EXCHANGES:
for cur in CURRENCIES:
balance_keeper = cur+'_'+ex
balance_keeper=Balance(ex,cur)
for balance in BALANCES:
if balance[0] == cur:
val = balance[1]
print(str(ex)+str('_')+str(cur)+str(' updated to : ')+str(+val))
balance_keeper.update(val)
balance_keeper.get()
poloniex_BTC updated to : 5.0
5.0
poloniex_ETH updated to : 10.0
10.0
poloniex_XRP updated to : 100.0
100.0
poloniex_XLM updated to : 1000.0
1000.0
poloniex_NEO updated to : 100.0
100.0
poloniex_DASH updated to : 10.0
10.0
poloniex_XMR updated to : 10.0
10.0
poloniex_LSK updated to : 1000.0
1000.0
poloniex_ZEC updated to : 10.0
10.0
poloniex_LTC updated to : 20.0
20.0
poloniex_ETC updated to : 20.0
20.0
poloniex_ADA updated to : 1000.0
1000.0
poloniex_XMR updated to : 10.0
10.0
cex_BTC updated to : 5.0
5.0
cex_ETH updated to : 10.0
10.0
cex_XRP updated to : 100.0
100.0
cex_XLM updated to : 1000.0
1000.0
cex_NEO updated to : 100.0
100.0
cex_DASH updated to : 10.0
10.0
cex_XMR updated to : 10.0
10.0
cex_LSK updated to : 1000.0
1000.0
cex_ZEC updated to : 10.0
10.0
cex_LTC updated to : 20.0
20.0
cex_ETC updated to : 20.0
20.0
cex_ADA updated to : 1000.0
1000.0
cex_XMR updated to : 10.0
10.0
bittrex_BTC updated to : 5.0
5.0
bittrex_ETH updated to : 10.0
10.0
bittrex_XRP updated to : 100.0
100.0
bittrex_XLM updated to : 1000.0
1000.0
bittrex_NEO updated to : 100.0
100.0
bittrex_DASH updated to : 10.0
10.0
bittrex_XMR updated to : 10.0
10.0
bittrex_LSK updated to : 1000.0
1000.0
bittrex_ZEC updated to : 10.0
10.0
bittrex_LTC updated to : 20.0
20.0
bittrex_ETC updated to : 20.0
20.0
bittrex_ADA updated to : 1000.0
1000.0
bittrex_XMR updated to : 10.0
10.0
binance_BTC updated to : 5.0
5.0
binance_ETH updated to : 10.0
10.0
binance_XRP updated to : 100.0
100.0
binance_XLM updated to : 1000.0
1000.0
binance_NEO updated to : 100.0
100.0
binance_DASH updated to : 10.0
10.0
binance_XMR updated to : 10.0
10.0
binance_LSK updated to : 1000.0
1000.0
binance_ZEC updated to : 10.0
10.0
binance_LTC updated to : 20.0
20.0
binance_ETC updated to : 20.0
20.0
binance_ADA updated to : 1000.0
1000.0
binance_XMR updated to : 10.0
10.0
okex_BTC updated to : 5.0
5.0
okex_ETH updated to : 10.0
10.0
okex_XRP updated to : 100.0
100.0
okex_XLM updated to : 1000.0
1000.0
okex_NEO updated to : 100.0
100.0
okex_DASH updated to : 10.0
10.0
okex_XMR updated to : 10.0
10.0
okex_LSK updated to : 1000.0
1000.0
okex_ZEC updated to : 10.0
10.0
okex_LTC updated to : 20.0
20.0
okex_ETC updated to : 20.0
20.0
okex_ADA updated to : 1000.0
1000.0
okex_XMR updated to : 10.0
10.0
У меня проблема в том, что переменная balance_keeper
не выполняет то, что я ожидал.Например, посмотрите, что две последние строки выше.
Вместо инициализации объекта okex_ADA
, а затем последующей инициализации нового объекта okex_XMR
, объект просто перезаписывается с каждой итерацией и переменнойто, что balance_keeper
должно содержать, вообще не инициализируется;скорее, цикл просто продолжает присваивать объекту буквальную переменную с именем 'balance_keeper' вместо переменной (пример okex_XMR), которую он должен содержать:
>>> okex_XMR.get()
Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
okex_XMR.get()
NameError: name 'okex_XMR' is not defined
Как видите, вместо создания новый объект, он просто перезаписывает предыдущий объект во время итерации:
>>> balance_keeper.get()
10.0
Что я делаю не так?Как я могу перебирать эти списки и правильно инициализировать каждую переменную, а не просто перезаписывать переменную-заполнитель?