функция asyn c magi c с использованием @ register_line_magi c из Ipython - PullRequest
0 голосов
/ 02 марта 2020

Попытка создать функцию asyn c magi c с помощью @ register_line_magi c, в конце концов я буду вынужден ждать sayncio.sleep для aioredis, и я хочу, чтобы она блокировалась. Я попытался заменить строку res = await printit("5") на res = await asyncio.create_task(printit("5")), но в обоих случаях получаю результат ниже. Как мне напечатать print(l) на интерактивной оболочке?

Текущий вывод:

In [1]: resume
Out[1]: <coroutine object setup.<locals>.resume at 0x2abe42504680>

Ожидаемый вывод:

In [1]: resume
Out[1]: 5

Весь тестовый код:

import sys
import asyncio
from IPython.core.magic import register_line_magic
from IPython import start_ipython, get_ipython
from traitlets.config import Config

async def printit(l):
    await asyncio.sleep(10)
    print(l)

def setup():

    @register_line_magic
    async def resume(line):
        res = await printit("5")

async def main(ars):

    iconfig = Config()
    iconfig.InteractiveShellApp.exec_lines = [
        "Setup()",
    ]
    iconfig.TerminalIPythonApp.display_banner = False
    Setup = setup
    await asyncio.create_task(start_ipython(argv=[], user_ns=locals(), config=iconfig))


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    main_task = loop.create_task(main())
    loop.run_forever()
...