python / python/mypy

decorated classes trigger Incompatible types in "await" (actual type "DecoratedClass", expected type "Awaitable[Any]")

Abierto
#17,299 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug
Lenguaje dominante
Python
Estrellas
20.6k
Forks
3.3k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

I have a program who defined a decorator , and decorated to a classes.
Its design intention is to implement network requests through direct class calls.

eg: RequietApiClass(data), then run RequietApiClass.call.inner_implement_func to complete HTTP request.
The following code is an example of a problem display。It run OK, but mypy check types error. But, i dont know how to fixed it.
please help me, thanks!

import asyncio
from typing import Any, Awaitable, Type

def apiwrapper(cls: Type):
    return cls()

@apiwrapper
class RequestApiClass:
    def __init__(self):
        print("aaa")

    async def __call__(self, data):
        return data

async def test_api_cfg_ok():
    testdata = {"a": "a"}
    ret = DecoratedClass(testdata)
    result = await ret
    print(result)

asyncio.run(test_api_cfg_ok())

problem descript:

Too many arguments for "DecoratedClass"

Incompatible types in "await" (actual type "DecoratedClass", expected type "Awaitable[Any]")

if i conver class to sync, then will trigger new problem.

async_to_sync(DecoratedClass)({"a": "a"})

problem descript

Argument 1 to "async_to_sync" has incompatible type "Type[DecoratedClass]"; expected "Union[Callable[[], Coroutine[Any, Any, Never]], Callable[[], Awaitable[Never]]]"

environment:
python:3.8.10
mypy:1.10.0

mypy config:

[tool.mypy]
mypy_path = "./oemhasten/apps"
plugins = ["mypy_django_plugin.main", "mypy_drf_plugin.main"]
exclude = ["pyenv"]
explicit_package_bases = true
check_untyped_defs = true
disallow_untyped_decorators = true

[[tool.mypy.overrides]]
module = ["treebeard.*"]
ignore_missing_imports = true

[tool.django-stubs]
django_settings_module = "oemhasten.settings"

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el ejemplo proporcionado del decorador y la clase decorada bajo Python 3.8.10 y mypy 1.10.0, y después reproduce los diagnósticos indicados con la configuración mostrada. Traza cómo se tipan la clase decorada y su async call; se considera terminado cuando el ejemplo deja de producir los errores de argumentos y await indicados, o cuando el comportamiento se documenta como esperado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
devtools
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.