Python3 элегантный способ вложения асинхронных функций - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь асинхронно изменить возвращаемое значение асинхронной функции в python3. Извините, если это сбивает с толку ... Возможно, приведенный ниже код поможет уточнить.

Приведенный ниже код работает, но мне интересно, есть ли более элегантный способ написания функции "resol_user", которая является единственной функцией, которую я могу изменить.

from aiodataloader import DataLoader
import asyncio

class MyUserLoader(DataLoader):

    async def batch_load_fn(self, keys):
        print('Keys', keys)
        return keys

def resolve_user(dataloader, key):
    promise = dataloader.load(key)

    async def to_upper():
        value = await promise
        return value.upper()

    return to_upper()

async def test():
    dataloader = MyUserLoader()
    req1 = resolve_user(dataloader, 'user1')
    req2 = resolve_user(dataloader, 'user2')
    print('Values', await req1, await req2)

asyncio.run(test())

Приведенный выше код выводит следующее, что я и хочу. Вызовы загрузки являются пакетными.

Keys ['user1', 'user2']
Values USER1 USER2

Если функция resol_user выглядела так:

async def resolve_user(dataloader, key):
    return (await dataloader.load(key)).upper()

тогда вызовы загрузки НЕ пакетируются. Это потому, что блоки вызова ожидают. Программа напечатает это:

Keys ['user1']
Keys ['user2']
Values USER1 USER2

Еще раз, я хочу знать, есть ли более питонный способ написания первой реализации resol_user.

...