【问题标题】:asyncio.wait_for exec function error in Python3.7.2Python3.7.2 中的 asyncio.wait_for exec 函数错误
【发布时间】:2019-03-08 07:29:03
【问题描述】:

我尝试运行这段代码:

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 ```

你能帮我理解到底发生了什么吗?

【问题讨论】:

  • 您的意见是什么?损坏的输入是导致这种情况的唯一方法。

标签: python python-3.x python-asyncio


【解决方案1】:

从回溯中,您可以看到该错误发生在函数 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2021-05-10
    相关资源
    最近更新 更多