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 - TypeError:需要可迭代参数

TypeError:实例Python之间不支持'<'

python fbprophet错误,TypeError:'module'对象不可调用

TypeError:“NoneType”对象在 Python 中不可迭代

“TypeError:'WebElement'对象不可迭代”错误代码python爬取

TypeError:'int'对象不可迭代,使用 Python 3 [关闭]