2017-03-22 11 views
1

Angenommen, ich habe eine Schnittstelle A mit einer einzigen Funktion.Typ Hinweise für Klassen implementieren eine Schnittstelle

class A(metaclass=ABCMeta): 

    @abstractmethod 
    def spam(self, x: int) -> str: 
     pass 

Es gibt Klassen B und C, die diese Schnittstelle implementieren, aber sie werden nicht direkt initialisiert werden. Ich werde eine Fabrikmethode (sagen wir) haben, die mir ein passendes Objekt, das A implementiert, zurückgibt. Also in diesem Fall, wenn ich spam in B und C implementieren, sollte ich die Typhinweise wiederholen? Praktisch, da B und C nicht direkt verwendet werden, scheinen die Typhinweise für A ausreichend zu sein. Aber ich bin neugierig auf die beste Vorgehensweise in dieser Situation; und wenn es andere Probleme gibt, die berücksichtigt werden müssen.

+1

Wenn Sie eine statische Analyse durchführen, ist die sicherste Option, Hinweise überall zu liefern. Diese Frage hängt wirklich davon ab, wie statische Analysatoren implementiert werden. Ich glaube nicht, dass Analysatoren erkennen werden, dass Ihre Klasse eine abstrakte Methode implementiert und folglich die dort bereitgestellten Typen verwendet. –

Antwort

0

Vermutlich, da Sie B.spam implementieren, wird es keine triviale Implementierung sein (sonst, warum stören A.spam?). Sie sollten also wahrscheinlich den Körper von B.spam eingeben. In diesem Fall müssen Sie Typhinweise für die Argumente angeben und die Werte B.spam; Andernfalls behandelt mypy diese Typen als Any.

Beachten Sie, dass, wenn Sie Type Hints tun bieten, werden mypy prüfen, ob die Art der B.spam mit A.spam kompatibel ist seine rules for subclassing verwenden, aber nur wenn B leitet sich von A nicht praktisch; Wenn Sie nur A.register(B), ignoriert Mypy die Vererbungsbeziehung vollständig. Dies steht im Einklang damit, dass die Laufzeitumgebung .spam in den virtuellen Basisklassen nicht nachschlägt.

+0

Jede Erklärung, warum meine Antwort falsch ist, wäre willkommen. – max

Verwandte Themen