Dunder, ou "special methods"

Après une pause de près de 2 ans sans développer (c’est pas mal la retraite, vous devriez essayer!), je cherche à rattraper le temps perdu, et combler mes lacunes.
Sujet: dunder, ou “double_underscore”.
Ces identifiants, comme __init__, qui commencent et finissent par 2 underscores.
Comme nous tous, j’en utilise pleins, mais, au moment de chercher une définition officielle de ces “fonctions magiques” (effectivement appellées “magic functions” en plein d’endroits), macache! Pas de def officielle, ou bien je ne sais pas chercher!

Ah! Ah! Bien sur, en rédigeant ma question, je la creuse, et je tombe sur de nouveaux indices!

Il semblerait que “dunder” soit le nom vernaculaire de la chose, un peu comme en botanique il y a le nom courant, connu du pékin de base, et le nom latin, connu des seuls savants.
dans le glossaire (Glossary — Python 3.12.1 documentation) on trouve une entrée :

magic method

An informal synonym for special method.

lui-même défini plus loin:

special method

A method that is called implicitly by Python to execute a certain operation on a type, such as addition. Such methods have names starting and ending with double underscores. Special methods are documented in Special method names.

et la liste de ces “Special method names” est définie en : 3. Data model — Python 3.12.1 documentation

C’est le paragraphe 3.3, et il y en a 22 pages!
Et après, on dira que python est simple!

Bon, je sais pas vous mais moi, depuis Poutine, qd on appelle un truc “spécial”, je suis un peu méfiant. Mais bon, on avait choisi le terme avant lui.

Bon, merci de vos réponses!

Dunder c’est le raccourci oral pour underscore underscore underscore undersocre.

Donc pour lire __init__ on prononce “dunder init”.

Et on peut dire que “dunder init est une méthode spéciale”, et on peut parler de “la méthode spéciale dunder init”. (Je fais ces exemples pour tenter d’éclairer la différence que je fais entre les deux).

Spéciale dans le sens où, et tu as cité la doc aussi, c’est l’interpréteur qui l’appelle, pas nous.

Par abus on peut entendre, “les méthodes dunder”, ou “les dunder-methods”. Pourquoi pas, même si je n’aime pas trop ça a le mérite d’être clair.

digression Pour continuer sur ce sujet, en Python on a aussi des protocoles, pour moi un protocole c'est une ou plusieurs méthodes spéciales, avec les arguments qu'elles prennent, les types qu'elles renvoient, et le sens qu'on leur donne.

Par exemple le protocole “gestionnaire de contexte” c’est deux méthodes spéciales :

__enter__(self) qui peut renvoyer quelque chose.
__exit__(self, exc_type, exc_value, traceback) qui ne renvoie rien.

Et vive le duck typing : il est possible d’implémenter juste une partie d’un protocole, juste ce qui est nécessaire. Typiquement pour le protocole descripteur la doc le dit même clairement :

A descriptor can define any combination of __get__(), __set__() and __delete__().

Alors oui ça prend bien 22 pages pour documenter sans ambiguité le comportement de ces bêtes là…

Pour compléter sur ce point : souvent les méthodes en question sont implémentées directement en C dans CPython, donc plus difficiles à trouver.
Pour __init__ si je ne me trompe pas ça se passe par ici et par là.

J’aime beaucoup le livre “Fluent Python” pour sa description du data model Python - pas dispo en Français a ma connaissance.

Si si si, Fluent Python a été traduit en français, mais par un traducteur non développeur. Le résultat n’est pas mauvais, mais il aurait été meilleur s’il avait été relu par un développeur Python : dès la page 10 on trouve une erreur d’indentation dans un exemple de code…

Et ils ont traduit le titre, donc il est introuvable.

D’ici la Luciano a publié la 2ᵉ édition, pas traduite celle-ci, donc je vous conseille plutôt d’acheter la v2 en anglais.

PS: dans la version en français, tous les liens vers la doc de Python contiennent notre /fr/, et ca c’est cool.