clavier ouvert

Blog d'enseignement d'Adrien Foucart.
Toutes les opinions présentées ici n'engagent que moi. Blog garanti sans pub, sans traqueurs, et 100% rédigé par un humain.

🔎2025.09.24
merci Google

En développant riem [riem-project on gitlab.ulb.be], le projet que je suis en train de terminer (enfin, clôturer plutôt) dans mes derniers jours de chercheur à l’ULB, j’utilise le “viewer” Napari [napari.org] pour visualiser et annoter des images médicales. Napari est une excellente libraire Python, mais sa documentation est parfois un peu bancale. Je dois donc souvent faire appel à Google pour essayer de trouver comment certaines fonctionnalités fonctionnent.

Je cherchais en particulier comment pouvoir intercepter l’événement déclenché lorsqu’on ajoute un point dans l’interface. Je vous passe les détails du pourquoi. J’ai donc ouvert Google, et j’ai lancé la requête napari event when point added to layer.

Google ne donne plus des “résultats de recherche” comme première option, c’est dépassé. Au lieu de ça, j’ai évidemment eu droit à la fameuse “AI Overview”. En général, j’ignore l’AI Overview autant que possible. Mais étant un peu pressé, j’ai tout de même voulu tester cette fois-ci la solution qu’il me proposait. Le code fourni n’était pas utilisable tel quel, mais j’avais les lignes qui m’intéressaient:

Pour pouvoir intercepter l’événement:

points_layer.events.data.connect(on_point_added)

Et pour le traiter:

def on_point_added(event):
    if event.type == 'add':
        print("Point added!")

J’ai ajouté cela à mon programme et, sans grande surprise, je reçus en retour une erreur: type n’est pas un attribut de event. Zut. Mais où Google a-t-il cherché ce event.type? Heureusement, l’AI Overview fourni des sources. Dans ce cas-ci, la principale était une discussions sur Github [issue#2809 on github.com/napari], datant de 2021, et proposant de modifier le comportement du data event de Napari pour y ajouter un type, qui pourrait être “set”, “move”, “add” ou “remove”.

Le problème, évidemment, c’est qu’entre le moment où cette proposition a été faite et le moment où la fonctionnalité a été rajoutée dans Napari, deux ans se sont écoulés, et l’idée a fait son chemin et s’est transformée [pull#5967 on github.com/napari]. Dans la description du “pull request”, on voit que finalement l’événement n’a pas de type mais est associé à une action, qui peut être add, remove ou change. Le bon code serait donc:

def on_point_added(event):
    if event.action == 'add':
        print("Point added!")

Sauf que ça ne marche toujours pas. Heureusement, une fois qu’on sait quels fichiers sont impliqués dans cette fonctionnalité [pull#5967 files on github.com/napari], on peut aller voir à quoi ils ressemblent aujourd’hui. Et on peut ainsi retrouver que les actions ont été modifiées peu de temps après leur ajout [commit#bc3c1e3a on github.com/napari]: dorénavant, on trouve adding, removing, changing, added, removed et changed.

On peut donc faire:

def on_point_added(event):
    if event.action == 'adding':
        print("Appelé avant ajout du point")
    elif event.action == 'added':
        print("Appelé après ajout du point")

Ce qui fonctionne enfin.

L’AI Overview, une nouvelle fois, n’aura servit qu’à ralentir le processus, et à entraver l’apprentissage: quand bien même la réponse fournie aurait fonctionné, le fait de lire, même en diagonale, les pull requests et les codes des commits est extrêmement informatif sur le fonctionnement de la librairie. Si Google pouvait faire ce qu’il faisait tellement bien avant, c’est-à-dire me diriger tout de suite vers les bonnes sources d’information, il serait tellement plus utile !

Mais nous vivons à l’ère du tout-à-l’IA, et on ne peut pas se permettre de bêtement donner des informations correctes ou utiles… Par curiosité, j’ai regardé ce que Copilot et ChatGPT me proposaient, et aucun des deux n’avaient de bonne solution non plus.

Commentaires, remarques, erreurs qu'il faut absolument me faire remarquer? Contactez-moi sur Mastodon ou par mail (adrien@adfoucart.be)