Python Async Attributeerror Aexit

Python Async Attributeerror Aexit

I keep getting error AttributeError: __aexit__ on the code below, but I don't really understand why this happens.

My Python version is: 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]

import aiohttp
import asyncio
import tqdm


async def fetch_url(session_, url_, timeout_=10):
    with aiohttp.Timeout(timeout_):
        async with session_.get(url_) as response:
            text = await response.text()
            print("URL: {} - TEXT: {}".format(url_, len(text)))
            return text


async def parse_url(session, url, timeout=10):
    # get doc from url
    async with await fetch_url(session, url, timeout) as doc:
        print("DOC: {}".format(doc, len(doc)))
        return doc


async def parse_urls(session, urls, loop):
    tasks = [parse_url(session, url) for url in urls]
    responses = [await f for f in tqdm.tqdm(asyncio.as_completed(tasks), total = len(tasks))]
    return responses


if __name__ == '__main__':

    tickers = ['CTXS', 'MSFT', 'AAPL', 'GPRO', 'G', 'INTC', 'SYNC', 'SYNA']
    urls = ["".format(ticker) for ticker in tickers]

    loop = asyncio.get_event_loop()
    with aiohttp.ClientSession(loop=loop) as session:
        parsed_data = loop.run_until_complete(parse_urls(session, urls, loop))
        print(parsed_data)

Error callstack:

C:\Python\Python36\python.exe C:/Users/me/.PyCharmCE2017.3/config/scratches/scratch_4.py
  0%|          | 0/8 [00:00<?, ?it/s]Traceback (most recent call last):
URL:  - TEXT: 462138
  File "C:/Users/me/.PyCharmCE2017.3/config/scratches/scratch_4.py", line 34, in <module>
    parsed_data = loop.run_until_complete(parse_urls(session, urls, loop))
  File "C:\Python\Python36\lib\asyncio\base_events.py", line 467, in run_until_complete
    return future.result()
  File "C:/Users/me/.PyCharmCE2017.3/config/scratches/scratch_4.py", line 23, in parse_urls
    responses = [await f for f in tqdm.tqdm(asyncio.as_completed(tasks), total = len(tasks))]
  File "C:/Users/me/.PyCharmCE2017.3/config/scratches/scratch_4.py", line 23, in <listcomp>
    responses = [await f for f in tqdm.tqdm(asyncio.as_completed(tasks), total = len(tasks))]
  File "C:\Python\Python36\lib\asyncio\tasks.py", line 458, in _wait_for_one
    return f.result()  # May raise f.exception().
  File "C:/Users/me/.PyCharmCE2017.3/config/scratches/scratch_4.py", line 16, in parse_url
    async with await fetch_url(session, url, timeout) as doc:
AttributeError: __aexit__


Process finished with exit code 1

1 Answer

You are trying to use fetch_url as a context manager, but it isn't one. You can either make it one

class fetch_url:
    def __init__(self, session, url, timeout=10):
        self.session = session
        self.url = url
        self.timeout = timeout

    async def __aenter__(self):
        with aiohttp.Timeout(self.timeout):
            async with self.session.get(self.url) as response:
                text = await response.text()
                print("URL: {} - TEXT: {}".format(self.url, len(text)))
                return text

    async def __aexit__(self, exc_type, exc, tb):
        # clean up anything you need to clean up

or change your code to

async def parse_url(session, url, timeout=10):
    # get doc from url
    doc = await fetch_url(session, url, timeout)
    print("DOC: {}".format(doc, len(doc)))
    return doc

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sophia Al-Mansoor
Author

Sophia Al-Mansoor

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.