python / python/mypy

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

Offen
#17,299 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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"

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem bereitgestellten Decorator- und dekorierten-Klassen-Beispiel unter Python 3.8.10 und mypy 1.10.0 und reproduziere anschließend die gemeldeten Diagnosen mit der gezeigten Konfiguration. Verfolge, wie die dekorierte Klasse und ihr async call typisiert werden; abgeschlossen ist die Aufgabe, wenn das Beispiel die gemeldeten Argument- und await-Fehler nicht mehr erzeugt oder das Verhalten als erwartungsgemäß dokumentiert ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.