Я пытаюсь асинхронно изменить возвращаемое значение асинхронной функции в 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.