Как использовать объекты списка в качестве аргументов внутри функции python?

#python #list #function #keyword-argument #etherscan

Вопрос:

Я новичок в программировании и столкнулся со следующей проблемой.

Я не могу найти способ передать объекты списка в качестве аргументов в следующей функции.

Моя цель с помощью этой функции состоит в том, чтобы просмотреть все объекты списка один за другим и сохранить данные в виде переменной с именем erc20.

Ссылка на файл .json // Ссылка на etherscan-python github

 from etherscan import Etherscan
import json


with open('adress-tracker.json') as json_file:
    json_data = json.load(json_file)

    print(json_data)


# Here we create a result list, in which we will store our addresses
result_list = [json_dict['Address'] for json_dict in json_data]

eth = Etherscan("APIKEY") #removed my api key

erc20 = eth.get_erc20_token_transfer_events_by_address(address = result_list, startblock="0", endblock="999999999", sort='asc')

print(erc20)


 

Это вернет следующую ошибку:

 AssertionError: Error! Invalid address format -- NOTOK
 

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

Я попытался изменить список на каталог, а также попытался реализовать аргументы ключевых слов с помощью (*result_list) или создал новую переменную под названием params со всеми необходимыми аргументами. Затем используется (*параметры). Но, к сожалению, я не могу понять, как решить эту проблему.

Заранее большое вам спасибо!

Комментарии:

1. Добро пожаловать в StackOverflow! Знаете ли вы о func(*args) нотациях и func(**kwargs) обозначениях?

2. address параметр должен быть строкой, а не списком, поэтому используйте цикл for для перебора results_list и передачи значения по одному параметру адреса

3. эта функция не может получить список адресов, и вам нужно использовать for -loop для отдельной проверки каждого адреса.

Ответ №1:

Эта функция ожидает один адрес, поэтому вам нужно использовать for -loop для отдельной проверки каждого адреса

 erc20 = []

for address in result_list:
    result = eth.get_erc20_token_transfer_events_by_address(address=address, 
                                                            startblock="0", 
                                                            endblock="999999999", 
                                                            sort='asc')
    erc20.append(result)
    
print(erc20)
 

Редактировать:

Минимальный рабочий код, который работает для меня:

 import os
import json
from etherscan import Etherscan

TOKEN = os.getenv('ETHERSCAN_TOKEN')
eth = Etherscan(TOKEN)

with open('addresses.json') as json_file:
    json_data = json.load(json_file)
    #print(json_data)

erc20 = []

for item in json_data:
    print(item['Name'])
    result = eth.get_erc20_token_transfer_events_by_address(address=item['Address'],
                                                            startblock="0",
                                                            endblock="999999999",
                                                            sort='asc')
    erc20.append(result)
    print('len(result):', len(result))
    
#print(erc20)

#for item in erc20:
#    print(item)
 

Результат:

 Name 1
len(result): 44
Name 2
len(result): 1043
Name 3
len(result): 1