Il nuovo modulo typing
contiene diversi oggetti con nomi come "SupportsInt" (-Float, -Bytes, ecc.). Il nome e le descrizioni su the documentation page for the module potrebbero essere letti per suggerire che è possibile verificare se un oggetto è di un tipo che "supporta __int__()
". Ma se si tenta di utilizzare isinstance()
, dà una risposta che rende chiaro che questo non è qualcosa che sono destinati a fare:"I protocolli non possono essere usati con isinstance()" - perché no?
>>> isinstance(5, typing.SupportsInt)
(Traceback omitted)
TypeError: Protocols cannot be used with isinstance().
D'altra parte, è possibile utilizzare issubclass()
:
>>> issubclass((5).__class__, typing.SupportsInt)
True
>>> issubclass(type(5), typing.SupportsInt)
True
Che cos'è un "protocollo" in questo contesto? Perché non consente l'utilizzo di isinstance()
in questo modo?
Lo scopo del modulo 'typing' è ** non ** fornire un modo per eseguire tali controlli. Ha lo scopo di fornire un modo comune per fornire i tipi di funzioni ecc. Nelle loro annotazioni. La duck tipizzazione è ancora preferita, puoi usare questi tipi per dire al tuo utente come si intende chiamare la funzione. – Bakuriu
@Bakuriu, ma il modulo di battitura è fornito in parte per consentire il controllo statico dei tipi, e quindi è ragionevole supporre che fornirà il meccanismo per identificare (dire) se un particolare oggetto è di un tipo particolare. Se invoco una funzione che passa 5 come parametro annotato come di tipo typing.SupportsInt, allora come farà un correttore di tipo statico a sapere che questo è valido? – Hammerite