Python TypeError:“_asyncio.Future”对象不可下标
Posted
技术标签:
【中文标题】Python TypeError:“_asyncio.Future”对象不可下标【英文标题】:Python TypeError: '_asyncio.Future' object is not subscriptable 【发布时间】:2021-08-15 15:58:35 【问题描述】:下午好!我正在制作一个需要使用 Python requests 库将 10,000 张图像发布到 API 的程序。发送每个请求后,我会收到一个带有哈希(IpfsHash)的响应,我需要将其写入以下形式的字典:“Hash”:“Number”。首先,我创建了一个简单的代码(使用循环而不是使用异步)并且它有效。然后我使用 async 来加快速度。 代码如下:
import asyncio
import requests
jsonHashes =
responses = []
def pinToIPFS(number):
url = 'https://api.pinata.cloud/pinning/pinFileToIPFS'
par =
'pinata_api_key': 'blabla',
'pinata_secret_api_key': 'blabla'
file = 'file': open(str(number) + '.jpg', 'rb')
res = requests.post(url, headers = par, files = file)
jsonHashes[res.json()['IpfsHash']] = number
print(res.json()['IpfsHash'] + ' = ' + str(number))
async def main():
loop = asyncio.get_event_loop()
futures = []
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(jsonHashes)
但是,由于某种原因,我得到了错误:
TypeError: '_asyncio.Future' object is not subscriptable
在那之后,我立即收到了对请求的回复:
QmcZR3cpeVzQ56gyWs83dRS51rtkqjyoF167paJMPrn32w = 1
QmehUERFcR6Erha6RtScDwfm1ACpZgGPrd5NNVnYWeDoH4 = 0
附:为简单起见,我设置了 2 次迭代而不是 10,000 次。
【问题讨论】:
将错误的完整回溯显示为问题中格式正确的文本。 @MichaelButscher 感谢您的回答,但我刚刚意识到我有一个错误在线:futures = loop.run_in_executor(None, pinToIPFS, i)
它必须是:futures.append(loop.run_in_executor(None, pinToIPFS, i))
但我仍然得到错误:AttributeError: 'NoneType' object has no attribute 'json'
因为python在接收到来自服务器的响应之前写入函数执行的结果。你知道如何解决这个问题吗?
如果您要使用请求并在线程中运行所有内容,为什么还要使用 asyncio?为什么不使用 asyncio 感知 http 库?
最好用修改后的代码和完整的回溯创建一个新问题。
【参考方案1】:
有问题的部分在这里:
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop.run_in_executor
返回一个 asyncio.Future
对象,而不是它们的列表。我不知道如何重写您的代码以使其工作 - 首先,我不熟悉 asyncio
,但主要是因为我认为根本不需要第二个 for 循环。
【讨论】:
哦,是的,我错了。谢谢。我将这一行替换为:futures.append(loop.run_in_executor(None, pinToIPFS, i))
现在我得到了错误:AttributeError: '_asyncio.Future' object has no attribute 'json'
另外我将第二个循环中的行更改为:jsonHashes[(await futures[i]).json()['IpfsHash']] = i
现在我得到了错误:AttributeError: 'NoneType' object has no attribute 'json'
我认为这是因为代码在收到来自服务器的响应之前请求 json 属性。你知道如何解决这个问题吗?
@maxet24 不,对不起,正如我所说,我不熟悉asyncio
。【参考方案2】:
您必须以这种方式分隔代码才能真正等待结果:
f = await futures[i]
json = f.json()['IpfsHash']
jsonHashes[json]
【讨论】:
@maxet24,就是这个答案。几天前我遇到了类似的错误。以上是关于Python TypeError:“_asyncio.Future”对象不可下标的主要内容,如果未能解决你的问题,请参考以下文章
python fbprophet错误,TypeError:'module'对象不可调用
TypeError:“NoneType”对象在 Python 中不可迭代