🔎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.