一个用于包装 sync context manager 为 async context manager 的执行函数
(
cm: AbstractContextManager[T],
)
| 263 | |
| 264 | @asynccontextmanager |
| 265 | async def run_sync_ctx_manager( |
| 266 | cm: AbstractContextManager[T], |
| 267 | ) -> AsyncGenerator[T, None]: |
| 268 | """一个用于包装 sync context manager 为 async context manager 的执行函数""" |
| 269 | try: |
| 270 | yield await run_sync(cm.__enter__)() |
| 271 | except Exception as e: |
| 272 | ok = await run_sync(cm.__exit__)(type(e), e, None) |
| 273 | if not ok: |
| 274 | raise e |
| 275 | else: |
| 276 | await run_sync(cm.__exit__)(None, None, None) |
| 277 | |
| 278 | |
| 279 | @overload |