Halbgenerische Rückgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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))
Antworten