Класс Python - Назначение значений объектов путем перебора списка - PullRequest
0 голосов
/ 04 января 2019

Я пишу программу, в которой требуется функция для отслеживания смоделированной стоимости нескольких различных валютных кошельков на нескольких биржах.Я написал класс для объявления, хранения и извлечения смоделированного баланса:

>>> 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

Что я делаю не так?Как я могу перебирать эти списки и правильно инициализировать каждую переменную, а не просто перезаписывать переменную-заполнитель?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Я думаю, что вы упустили понять синтаксис в Python.Посмотрите на этот код: balance_keeper = cur+'_'+ex.Как я вижу, вы ожидали, что balance_keeper станет переменным, подобным okex_XMR.Нет, это не работает таким образом.

  1. Приведенное выше назначение только присваивает строку balance_keeper.Не переменнаяПомните, что cur+'_'+ex является выражением и возвращает строку!

  2. Значение balance_keeper будет перезаписано сразу после этого balance_keeper=Balance(ex,cur).

  3. Идея состоит в том, чтобы сохранить несколько кошельков, каждый из которых идентифицируется парой валюты и обменного курса.Это приводит к использованию словаря, с ключом является кортеж (cur, ex).

0 голосов
/ 04 января 2019

Используйте словарь для хранения ваших объектов, присваивая им строковые имена

datadict = {}
for ex in EXCHANGES:
    for cur in CURRENCIES:
        ex_cur_name = cur+'_'+ex
        datadict[ex_cur_name] = Balance(ex, cur)

Затем вы можете получить доступ к объектам через:

>>>datadict[ex_cur_name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...