Введите аннотацию подсказки для декоратора вокруг функции синхронизации/асинхронизации.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Введите аннотацию подсказки для декоратора вокруг функции синхронизации/асинхронизации.

Сообщение Anonymous »

Как правильно указать аннотацию типа для декоратора, которая может применяться как к синхронным, так и к асинхронным функциям? Тип полученной функции я указываю как type FuncType[**P, R] = AsyncFuncType[P, R] | SyncFuncType[P, R]. И один из AsyncFuncType или SyncFuncType для оболочек. Но оболочки ожидают FuncType.

Код: Выделить всё

import asyncio
from functools import wraps
from typing import Any, Awaitable, Callable, Type

type AsyncFuncType[**P, R] = Callable[P, Awaitable[R]]
type SyncFuncType[**P, R] = Callable[P, R]
type FuncType[**P, R] = AsyncFuncType[P, R] | SyncFuncType[P, R]

def exc_wrapper[**P, R](
exc_in: Type[Exception], exc_out: Type[Exception], *exc_args: Any, **exc_kwargs: Any
) -> Callable[[FuncType[P, R]], FuncType[P, R]]:
def decorator(
func: FuncType[P, R],
) -> FuncType[P, 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) -> Awaitable[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:19: error: Incompatible return value type (got "Awaitable[R] | R", expected "R")  [return-value]
src\core\utils\decorators.py:26: error: Incompatible types in "await" (actual type "Awaitable[R] | R", expected type "Awaitable[Any]")  [misc]
src\core\utils\decorators.py:31: error: Incompatible return value type (got "_Wrapped[P, object, P, Coroutine[Any, Any, Awaitable[R]]]", expected "Callable[P, Awaitable[R]] | Callable[P, R]")  [return-value]
Работает только при синхронизации:

Код: Выделить всё

type FuncType[**P, R] = Callable[P, R]

def exc_wrapper[**P, R](
exc_in: Type[Exception], exc_out: Type[Exception], *exc_args: Any, **exc_kwargs: Any
) -> Callable[[FuncType[P, R]], FuncType[P, R]]:
def decorator(
func: FuncType[P, R],
) -> FuncType[P, 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)

return sync_wrapper

return decorator
или только асинхронно:

Код: Выделить всё

type FuncType[**P, R] = Callable[P, Awaitable[R]]

def exc_wrapper[**P, R](
exc_in: Type[Exception], exc_out: Type[Exception], *exc_args: Any, **exc_kwargs: Any
) -> Callable[[FuncType[P, R]], FuncType[P, R]]:
def decorator(
func: FuncType[P, R],
) -> FuncType[P, R]:
@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)

return async_wrapper

return decorator
Оба — нет.


Подробнее здесь: https://stackoverflow.com/questions/791 ... c-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Введите аннотацию подсказки для декоратора с новым синтаксисом.
    Anonymous » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Введите аннотацию подсказки для декоратора с новым синтаксисом.
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Функции асинхронизации или синхронизации
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Функции асинхронизации или синхронизации
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать фабрику декоратора и декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»