Мне нужен менеджер контекста, вложенный в класс, который при выходе возвращает значение в зависимости от того, что произошло в блоке кода. По сути, это будет анализировать содержимое файла журнала во время работы блока кода.
В настоящее время я могу это сделать:
Код: Выделить всё
print("start")
# do something here
print("end")
res = await check_log() # check in the log if something's happened
# between start and end and return the line if so
Мне интересно, могу ли я вместо этого использовать asynccontextmanager contextlib, который выглядит так:
Код: Выделить всё
class foo():
def __init__(self, ...):
...
@asynccontextmanager
async def bar(self):
print("start")
fut = asyncio.Future()
yield fut
print("end")
res = await check_log()
fut.set_result(res)
и который я называю так:
Код: Выделить всё
obj = foo(...)
async with foo.bar() as b:
# do something here
res = b.result()
Есть ли в этом что-то принципиально небезопасное или неправильное? Если да, то есть ли лучший способ сделать это? Я знаю, что с помощью обычного менеджера контекста вы можете обойти это, установив атрибут, хотя я не уверен, что это возможно с помощью contextlib.
Подробнее здесь:
https://stackoverflow.com/questions/787 ... ger-unsafe