Seite 1 von 1

Halbgenerische Rückgabe

Verfasst: Donnerstag 26. Juli 2018, 12:40
von sprudel
Hallo,

ich versuche gerade, folgenden Code umzusetzen:

Code: Alles auswählen

Q = TypeVar("Q")
...
@classmethod
    def query_of(cls, t: Type[Q], **kwargs) -> List[Q]:
        objects: List[Q] = []
        for o in cls.query(**kwargs):
            if not isinstance(o,t):
                continue
            objects.append(o)
        return objects
Das Ziel soll sein, dass ich hier einen Typ als Parameter übergeben kann und auch nur Objekte dieses Typs in der Liste bekommen will. Als "Gegenleistung" hierfür soll die zurückgegebene List dann eben schon passend typisiert sein.
Der Code funktioniert auch so weit, aber PyCharm beschwert sich, weil isinstance nicht für generische Typen verwendet werden kann. Sehe ich es richtig, dass die Fehlermeldung hier einfach ungeschickt ist? Oder habe ich einen Denkfehler?

Vielen Dank.

Re: Halbgenerische Rückgabe

Verfasst: Donnerstag 26. Juli 2018, 18:32
von Sirius3
Das zeigt mal wieder, dass dieses ganze Typannotationsgedöns völlig unsinnig ist.

Was ist denn das für eine Query, die ohne eine Instanz auskommt? Und warum liefert eine Query unterschiedliche Typen? Da ist hoffentlich kein globaler Zustand im Spiel. `continue` sollte man dort vermeiden, wo es einfach geht.

Läßt man also den ganzen unnötigen Balast weg, sieht die Funktion schon viel lesbarer aus:

Code: Alles auswählen

    @classmethod
    def query_of(cls, type, **kwargs):
        return [
            obj for obj in cls.query(**kwargs)
            if isinstance(obj, type)
        ]
Besser ist es sowieso, ganz auf die Funktion zu verzichten und `filter` zu verwenden:

Code: Alles auswählen

is_a_str = lambda obj: isinstance(obj, str)
result = filter(is_a_str, cls.query(**kwargs))