Асинхронный вариант (asincio) пустого менеджера контекста (nullcontext) в Python
Если вы используете менеджер контекста
в операторе with
и вам нужно сделать его использование опциональным, то можно применить
nullcontext
как вариант “не использовать менеджер контекста””.
Например в функцию передается s3
boto client но функция может создать и свой, если он не передан:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Но, например, в aiobotocore вам нужен асинхронный менеджер контекста:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |