首页 > 解决方案 > Asyncio 可下标问题

问题描述

我正在尝试使用asyncio库向某个 url 发出请求调用,但我正在检索错误TypeError: 'coroutine' object is not subscriptable

provider = []
def get_tasks(session):
    tasks = []
    for number in list(american['mobile_number'].values):        
        url = 'https://api.telnyx.com/v1/phone_number/1' + number
        loop = asyncio.get_event_loop()
        tasks.append(loop.create_task(session.get(url, ssl=False)))
    return tasks

async def get_carrier():
    async with aiohttp.ClientSession() as session:
        tasks = get_tasks(session)
        responses = await asyncio.gather(*tasks)
        for response in responses:
            provider.append(await response.json()['carrier']['name'])

asyncio.get_event_loop().run_until_complete(get_carrier())

错误:

TypeError: 'coroutine' object is not subscriptable

标签: pythonasynchronousasync-awaitpython-asyncio

解决方案


因此,作为一个例子,我会避免使用两个异步循环,而只是做类似的事情。

import asyncio
import aiohttp
import aiohttp.client_exceptions


async def get_carrier():
    async with aiohttp.ClientSession() as session:
        for number in ['6613686502', '5166100971', '4436029240', '5707018841', '7049668597']:
            url = 'https://api.telnyx.com/v1/phone_number/1' + number
            async with session.get(url, ssl=False) as response:
                try:
                    resp_json = await response.json()
                    print(f"{number}, {resp_json['carrier']['name']}")
                except aiohttp.client_exceptions.ContentTypeError as e:
                    print(f"{number}, Unable to find data")


asyncio.get_event_loop().run_until_complete(get_carrier())

输出 我不确定 api 是否存在限制并且轮询速度太快,因为我得到的结果不一致。

6613686502, ONVOY, LLC - CA
5166100971, Unable to find data
4436029240, Unable to find data
5707018841, Unable to find data
7049668597, ONVOY, LLC - NC

推荐阅读