asyncio.wait_for ошибка функции exec в Python3.7.2 - PullRequest
2 голосов
/ 08 марта 2019

Я пытаюсь запустить этот код:

import asyncio

async def eva(code):
    exec("async def ex(): return {}".format(code))
    return await asyncio.wait_for(locals()["ex"](), timeout=1.0)

async def main():
    while True:
        code = input()
        x = await asyncio.wait_for(eva(code), timeout=1.0)
        print(x)
asyncio.run(main())

И получаю следующую ошибку:

<module>

    asyncio.run(main())   File "C:\Users\\{user}\AppData\Local\Programs\Python\Python37\lib\asyncio\runners.py",
line 43, in run

    return loop.run_until_complete(main)   File "C:\Users\\{user}\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py",
line 584, in run_until_complete
    return future.result()

  File "eval.py", line 10, in main

    x = await asyncio.wait_for(eva(code), timeout=1.0)   File "C:\Users\\{user}\AppData\Local\Programs\Python\Python37\lib\asyncio\tasks.py",
line 416, in wait_for
    return fut.result()

  File "eval.py", line 5, in eva

    return await asyncio.wait_for(locals()["ex"](), timeout=1.0)

  File "C:\Users\\
{user}\AppData\Local\Programs\Python\Python37\lib\asyncio\tasks.py",
line 416, in wait_for

    return fut.result()

  File "<string>", line 1, in ex TypeError: 'int' object is not
iterable ```

Можете ли вы помочь мне понять, что именно происходит?

1 Ответ

0 голосов
/ 08 марта 2019

Из трассировки вы можете видеть, что ошибка произошла у функции ex:

File "<string>", line 1, in ex

И незадолго до этого была выполнена эта строка:

File "eval.py", line 5, in eva
    return await asyncio.wait_for(locals()["ex"](), timeout=1.0)

Другими словами, возникло исключениегде-то внутри сопрограммы ex вы получили от locals()["ex"].


Сообщение об исключении:

TypeError: объект 'int' не повторяется

Вы можете погуглить его, чтобы понять типичную ситуацию, когда это может произойти, но нетрудно предположить, что тоже: что-то внутри ex пыталось выполнить итерацию объекта типа int.

Нечто подобное произошло:

import asyncio


async def ex():
    for i in 123:
        pass

async def main():
    return await asyncio.wait_for(ex(), timeout=1.0)


asyncio.run(main())

Запустите и вы увидите похожее:

  File "...\main.py", line 15, in main
    return await asyncio.wait_for(ex(), timeout=1.0)
  File "...\python37\lib\asyncio\tasks.py", line 416, in wait_for
    return fut.result()
  File "...\main.py", line 11, in ex
    for i in 123:
TypeError: 'int' object is not iterable
...