Как аннотировать декоратор аргументами? Что мне следует передать, чтобы вернуть тип exc_wrapper?
import asyncio
from functools import wraps
from typing import Any, Awaitable, Callable, Type
def exc_wrapper(
exc_in: Type[Exception], exc_out: Type[Exception], *exc_args: Any, **exc_kwargs: Any
) -> Callable:
def decorator[**P, R](func: Callable[P, Awaitable[R] | R]) -> Callable[P, R | Awaitable[R]]:
@wraps(func)
def sync_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
try:
return func(*args, **kwargs)
except exc_in:
raise exc_out(*exc_args, **exc_kwargs)
@wraps(func)
async def async_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
try:
return await func(*args, **kwargs)
except exc_in:
raise exc_out(*exc_args, **exc_kwargs)
if asyncio.iscoroutinefunction(func):
return async_wrapper
else:
return sync_wrapper
return decorator
MyPy выдает такие ошибки:
src\core\utils\decorators.py:13: error: Incompatible return value type (got "Awaitable[R] | R", expected "R") [return-value]
src\core\utils\decorators.py:20: error: Incompatible types in "await" (actual type "Awaitable[R] | R", expected type "Awaitable[Any]") [misc]
Примеры:
class MyExc(BaseException): ...
@exc_wrapper(AssertionError, MyExc)
def sync_func():
assert false
@exc_wrapper(AssertionError, MyExc)
async def sync_func():
assert false
Подробнее здесь: https://stackoverflow.com/questions/791 ... new-syntax
Введите аннотацию подсказки для декоратора с новым синтаксисом. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Введите аннотацию подсказки для декоратора вокруг функции синхронизации/асинхронизации.
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-