Асинхронный вариант (asincio) пустого менеджера контекста (nullcontext) в Python

Если вы используете менеджер контекста в операторе with и вам нужно сделать его использование опциональным, то можно применить nullcontext как вариант “не использовать менеджер контекста””.

Например в функцию передается s3 boto client но функция может создать и свой, если он не передан:

def create_object(s3=None):
session = get_session() if s3 is None else None
with session.create_client(
"s3"
) if s3 is None else contextlib.nullcontext() as s3_temp:
return (s3 or s3_temp).get_object(Bucket=bucket, Key=key)
view raw gistfile1.txt hosted with ❤ by GitHub

Но, например, в aiobotocore вам нужен асинхронный менеджер контекста:

session = get_session()
async with session.create_client("s3") as s3_temp:
s3_object = await s3_temp.get_object(Bucket=bucket, Key=key)

В Python нет асинхронного варианта для nullcontext.

Как решение вы можете использовать AsyncExitStack:

session = get_session() if s3 is None else None
async with session.create_client(
"s3"
) if s3 is None else contextlib.AsyncExitStack() as s3_temp:
s3_object = await (s3 or s3_temp).get_object(Bucket=bucket, Key=key)