Ces "immondices" sont la façon d’implémenter les ABC dans la lib standard. Ces implémentations tout ce qu’il y a de plus officielles et utilisées (souvent sans le savoir) par les "sociétés honorables" sont exactement pareilles que le DistanceMetric
du billet de blog.
J’irai même plus loin, l’existence de __subclasshook__
vient du mauvais design du système de type de Python qui mélange allègrement les notions de type, classe, et interface tout en déclarant haut et fort faire du duck typing. De fait, le isinstance(t: T, U)
porte deux significations qui sont un peu orthogonales mais que Python mélange :
T
est un sous-type de U
au sens le plus direct lorsqu’on dit que les types sont les classes : T
hérite simplement de U
;
T
implémente (au moins) la même interface que U
(structural subtyping), qui est en fait la sémantique que l’on veut lorsqu’on fait du duck typing : les histoires d’héritages ne sont qu’un morceau incomplet de la réponse à la question de savoir si on a effectivement un canard entre les mains.
La machinerie de __subclasshook__
est justement là pour que isinstance
renvoie un résultat pertinent lorsqu’on fait du duck typing, c’est à dire lorsqu’on veut s’intéresser à l’interface effectivement exposée par les objets que l’on manipule plutôt que leur classe. Le fait par ailleurs que Python va pas râler si tu fais n’importe quoi sémantiquement (typiquement en ayant des effets de bords dans __subclasshook__
) est juste que Python n’a aucun moyen de contrôler ça, et ça rejoint le contrat "on est entre adultes consentants" qui est de partout dans le langage.
Il n’y a vraiment rien de surprenant dans tout ce billet de blog, pour être franc.