Bonne pratique pour écrire une fonction
Bonjour,
j'ai une question "bonne pratique" (c'est en Python mais le langage n'a probablement aucune importance) : disons que je récupère dans un répertoire les images y figurant à l'aide d'une première fonction, puis que je fais un traitement sur l'une de ces images dans une seconde fonction (par exemple une pixellisation).
Pour être un peu plus concret, disons que ma première fonction récupère tous les fichiers d'extension bmp dans un répertoire passé en paramètre, puis renvoie l'image dont le nom vérifie un certain critère (peu importe, on peut imaginer que c'est le nom le plus court par exemple). Ma deuxième fonction appelle la première et récupère une image, puis fait le traitement. Mais évidemment mon répertoire pourrait être vide ou ne contenir aucune image (ou aucune ne vérifiant mon critère). Où vaut-il mieux traiter cette erreur et comment ? Je vois deux possibilités mais je ne sais pas si l'une est "meilleure" ou si ça n'a aucune importance dans le cas où mon répertoire ne contient pas d'image :
- on renvoie un code erreur (par exemple une chaine disant 'erreur') avec la première fonction et la deuxième fonction prend en compte cela avec un if et affiche un message d'erreur
- on renvoie quoi qu'il arrive quelque chose avec la première fonction (par exemple avec return()) et on gère l'erreur avec un try except dans la seconde fonction.
En fait, plus généralement, dans une fonction qui doit renvoyer quelque chose si tout va bien (l'immense majorité des cas), comment gérer le fait que sur certaines données, elle ne renvoie rien ? On ne renvoie juste rien et on laisse à une éventuelle seconde fonction le soin de gérer ce cas ou il vaut mieux le gérer immédiatement. Mais dans ce second cas, je ne trouve pas ma solution terrible puisqu'il faut être au courant que ma première fonction renvoie une chaîne ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
De plus pour faire propre je levais une exception adéquate à la situation, quitte à créer une exception personnalisée.
La seconde fonction utilise le première à l'intérieur d'un try/catch et traite toutes les exceptions éventuellement levées par la première.
Imagine que dans quelques mois tu doives remettre les mains dans le cambouis sur cet hypothétique gros projet, est-ce que tu vas te rappeler que la fonction F2 renvoyait quand même une image en cas d'erreur ? Probablement pas...
Avec les exceptions c'est plus propre. Si je veux utiliser la fonction F2 dans quelques mois, je ne dois pas aller lire son code pour voir si elle me renvoie des trucs bizarres en cas d'erreur. Je regarde direct la liste des exceptions qu'elle lève dans tel ou tel cas et fini.
En gros les fonctions doivent être des boîtes noires pour celui qui les utilise, on sait le type de données qu'elles renvoient et les exceptions qu'elles lèvent mais pas leur fonctionnement interne.
Bonjour,
Tu n'as pas besoin de deux fonctions, une seule suffit. Elle commence par vérifier si, dans le répertoire donné, existe au moins une image .bmp. Si ce n'est pas le cas, on termine. Sinon, elle charge chaque image l'une après l'autre et la traite. Il existe cependant des langages de programmation avec lesquels on parvient plus facilement au résultat recherché qu'avec d'autres, je pense en particulier à Php. Voici un exemple :
S'il n'y a aucune image .bmp dans ce dossier, l'array $images est vide et la boucle n'est tout simplement pas parcourue.
Voici un exemple pour être plus clair. Si la fonction d'Alban_ reçoit le nom d'un répertoire et doit renvoyer l'image qui vérifie un certain critère (en supposant qu'elle n'en renvoie qu'une s'il y en a plusieurs) on aurait un code comme ça (peu importe le langage) :
On lève une exception avec "throw" en php, avec "raise" en python. La fonction "renvoie_image" déclenche (ou lève) une exception si elle ne peut pas renvoyer d'image.
Une fonction qui utiliserait la fonction renvoie_image le ferait ainsi :
Voyons comment ChatGPT – s'il était déjà sorti en août 2022 – aurait répondu à la question de @Alban_ :
Q : écris un script Python qui cherche des images jpeg dans un répertoire de mon disque dur. S'il en trouve, il affiche leurs noms au moyen d'une boucle.
GPT :
Effectuer une recherche dans les sous-dossiers du répertoire ciblé :
Q : écris un script Python qui cherche des images bmp dans un répertoire de mon disque dur, ainsi que ses sous-dossiers. S'il en trouve, il affiche leurs noms au moyen d'une boucle.
GPT :
Le principe est le même que celui que j'ai indiqué plus haut en utilisant Php : si aucune image jpeg ou bmp n'existe dans le répertoire directory, rien ne s'affiche.
Variante :
Q : modifie ce script pour qu'il affiche "aucune image BMP trouvée" si la recherche dans le répertoire ne donne aucun résultat.
GPT :
Rien à redire, ça coule de source et ça fonctionne parfaitement. Notez que sous Windows, le chemin "/path/to/search/" doit être échappé : "C:\\path\\to\\search".
Voici ce que le modèle text-davinci-003 du Playground d'OpenAI renvoie lorsqu'on lui pose la même question que ci-dessus, c'est-à-dire afficher le nom de toutes les images .jpg présentes dans un répertoire donné :
On notera la simplicité de ce code, proche de celui de Php (voir mon premier post ci-dessus), et en tout cas plus simple et plus facile à comprendre que celui proposé par ChatGPT dans le dernier exemple de mon précédent message. Je ne dis pas pour autant que le Playground est meilleur que ChatGPT, loin de là.