我正在尝试使用 JSON 作为数据结构,来存储来自 API 的值,最终目标是能够稍后调用此数据并将其用于平台的其他方面。当前的问题是,当我将计数变量添加到列表中时,我将其转换为字符串并转储到 json 文件,但出现错误,但是当我完全删除计数变量并转储列表时,它工作正常,直到我尝试解码它,我尝试使用列表,因为(在我看来)将数据附加到它更容易,因为它是一个微服务,但我确实知道字典效率更高,但我也无法让它们工作。
代码有效,除非我添加计数变量,例如 n = 0 |计数 = str(n + 1)。在下面的代码中,有一些变量,例如throttle api等,上面定义了静态值,可以在设置模块中进行更改,即throttleApi = 30(timer.sleep函数的秒),并且代币余额也全部定义。
def add_entry(count,balance_list, Token1_balances, Token2_balances, Token3_balances,localtime):
# check if in seen set
if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
return balance_list
# add to seen set
seen.add(tuple([count,Token1_balances, Token2_balances, Token3_balances,localtime]))
# append to results list
balance_list.append({'count':count,Token1: Token1_balances, Token2: Token2_balances, Token3: Token3_balances,'time':localtime})
return balance_list
def write_to_json(lst, fn):
with open(fn, 'a', encoding='utf-8') as file:
for item in lst:
x = json.dumps(item, indent=4)
file.write(x + '\n')
balance_list = []
seen = set()
if __name__ == '__main__':
print('-'*40)
print(" Service Online and logging file has been established")
print('-'*40)
n = 0
while True:
time.sleep(throttleClient)
localtime = time.asctime( time.localtime(time.time()) )
minute = datetime.datetime.now().minute
print('Local current time:',localtime,'CDT\n')
if minute % throttleApi == 0:
try:
count = str(n + 1)
balance_query = p2p.getBalances()["result"]
Token1_balances = str(balance_query[Token1])
Token2_balances = str(balance_query[Token2])
Token3_balances = str(balance_query[Token3])
args1 = [count,Token1_balances, Token2_balances, Token3_balances,localtime]
balance_list = add_entry(balance_list, *args1) # add entry - SUCCESS
write_to_json(balance_list, 'balance.json')
except requests.exceptions.ConnectionError as e:
print(ConnectionError)
print('-'*20)
print("Can't log balances due to connection error")
pass
else:
pass
我本来期望得到
{
"count":"1",
"BTC": "{'available': '0.00524973', 'freeze': '0'}",
"ETH": "{'available': '0', 'freeze': '0'}",
"1SG": "{'available': '15.57', 'freeze': '0'}",
"time": "Sat Aug 3 16:08:04 2019"
}
等等,但我得到了 1) 上面的数据,没有计数 或 2)
File "balance_logging.py", line 105, in <module>
balance_list = add_entry(balance_list, *args1) # add entry - SUCCESS
File "balance_logging.py", line 56, in add_entry
if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
TypeError: unhashable type: 'list'
最佳答案
当你调用addEntry()时,你已经交换了balance_list和count。因此,您试图查看您的大元组是否在“已看到”集合中,您正在对其中包含列表的元组进行散列。但由于列表是可变的,并且不允许成为集合和字典键的一部分,因此您会收到所看到的错误。
关于python - TypeError : unhashable type: 'list' when adding a count variable, 没有工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343405/