Das neue Modul typing
enthält mehrere Objekte mit Namen wie "SupportsInt" (-Float, -Bytes, etc.). Der Name und die Beschreibungen unter the documentation page for the module könnten gelesen werden, um darauf hinzuweisen, dass Sie testen können, ob ein Objekt von einem Typ ist, der "__int__()
unterstützt". Aber wenn Sie versuchen, isinstance()
zu verwenden, ist es eine Antwort gibt, die deutlich macht, dass das ist nicht etwas, was Sie tun sollen:"Protokolle können nicht mit isinstance()" verwendet werden - warum nicht?
>>> isinstance(5, typing.SupportsInt)
(Traceback omitted)
TypeError: Protocols cannot be used with isinstance().
Auf der anderen Seite können Sie issubclass()
verwenden:
>>> issubclass((5).__class__, typing.SupportsInt)
True
>>> issubclass(type(5), typing.SupportsInt)
True
Was ist ein "Protokoll" in diesem Zusammenhang? Warum verbietet es auf diese Weise die Verwendung von isinstance()
?
Der Zweck des Moduls 'typing' ist ** nicht **, um eine Möglichkeit zur Durchführung dieser Prüfungen zu bieten. Es soll eine allgemeine Möglichkeit bieten, um die Arten von Funktionen usw. in ihren Anmerkungen bereitzustellen. Duck-Typisierung wird immer noch bevorzugt. Sie können diese Typen verwenden, um Ihrem Benutzer mitzuteilen, wie die Funktion aufgerufen werden soll. – Bakuriu
@Bakuriu, aber das Typisierungsmodul wird teilweise zur Verfügung gestellt, um eine statische Typprüfung zu erlauben, und daher ist es vernünftig anzunehmen, dass es die Maschinerie zum Identifizieren (sagen wir), ob ein bestimmtes Objekt von einem bestimmten Typ ist, bereitstellen wird. Wenn ich eine Funktion aufrufen, die 5 als einen Parameter mit dem Typ typing.SupportsInt übergibt, wie weiß dann ein statischer Typüberprüfer, dass dieser gültig ist? – Hammerite