"La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !
Toi , tu passes ton temps à dire beurk , faut pas terroriser le débutant @zied131 comme même (moi-même , vu mon niveau , je n'arrivais pas encore à inventer un code pareil).
Euh @wiztricks , je peux pas être plus explicite que ce que j'ai dit , sérieux , je faisais juste une sorte de parallèle : les jeux à la télé sont un exemple de programmation ...
_""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """
C'est très juste. Si cette fonction doit être plus qu'un exemple pédagogique, il faut mieux lever une exception. J'en profite pour demander comment gérer celle-ci. Je n'ai pas lu assez de code pour savoir quelle est la bonne pratique dans ce genre de cas.
Par exemple, entre:
et,
Code : Sélectionner tout - Visualiser dans une fenêtre à part assert n in range(2,11)
ou plus spécifique,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if not n in range(2,11): raise Exception('Erreur, parametre n doit etre entre 2 et 10')
ou encore le classique try/except:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if not n in range(2,11): raise ValueError('Erreur, parametre n doit etre entre 2 et 10')
Et bien d'autres, je ne sais jamais quelle est la "bonne" façon de faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 try: ... except: raise ValueError('Erreur, parametre n doit etre entre 2 et 10') else: ...
J
Le "beurk" était lié au code de l'appelant. Avec ta solution, la fonction se déroule toujours bien : elle retourne une chaine dans tous les cas.
C'est seulement en analysant le retour (la chaine) que l'appelant sait de quoi il retourne : erreur ? pas erreur ?
Donc, ça part sur de le comparaison de chaines. Ou de longueurs de chaines . Un "connard !" comme retour fait 9 caractères. Pas moyen de se baser sur la longueur de la chaine (un vrai mot peut avoir 10 caractères).
Après il y a un ' ' et un '!'. Il ne sont pas dans les "range" de caractères, certes mais .. c'est lourd (pour l'appelant)
D'où "ma" solution.
Je n'ai pas regardé en détail tes solutions, mais, je suis d'accord avec toi : comment faire au mieux ? Je n'ai, malheureusement, pas LA réponse. Mais je regarde toutes tes propositions "tranquillement".
[EDIT] des fois, j'ai du mal à me faire comprendre. Mais je regarde, activement, tes solutions, promis.
"La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !
Salut,
L'important est que l'appelant sache de façon sûre que la fonction appelée a fait le boulot attendu.
On pourrait écrire:
dans ce cas la fonction retournera None si l'entier n'est pas dans ]2..10]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 def MotAuHasard(n): # vérifier que 2<n<10. if 2 < n <= 10: mot = [ choice(string.ascii_lowercase) for _ in range (n) ] return ''.join(mot)
Problème: l'appelant oublie de tester la valeur de retour. Si le programme se vautre un peu plus loin, remonter à la cause sera plus compliqué... Et si en plus, cela provoque la corruption d'une base de donnée, il va falloir aussi restaurer un backup... Galère!
Avec une exception, l'appelé force le plantage du programme avec un message d'erreur explicite.
Mais dans la pratique, c'est ne pas trop faire confiance à l'appelant pour "tester" et l'obliger à écrire un try...except... s'il veut passer outre.
C'est comme le forcer à signer une décharge.
Intuitivement, cette parano est compréhensible lorsqu'on écrit une bibliothèque.
Dans ce cas, blinder les interfaces pour tester la validité des paramètres passés et remonter des exceptions "claires".
Ce sera un "plus" qui aidera l'utilisateur de la bibliothèque à planter assez tôt pour pouvoir corriger son code.
Pour les fonctions que vous écrivez vous, c'est plus délicat.
Car il y a des endroits ou vous serez en confiance, d'autres moins.
De plus pour mettre le code au point, vous pourrez le tourner sous un deboggeur symbolique, ajouter des log.debug(...), écrire des tests unitaires,...
Vous n'êtes plus sous la contrainte "interface utilisateur" mais sous celle d'avoir à faire fonctionner votre code assez vite.
Il faudra prendre le chemin le plus adapté selon la confiance que vous avez en vous, dans la connaissance des bibliothèques que utilisées,...
De toutes façons, avec l'expérience, le bon choix va s'imposer tout seul.
Mais c'est pas binaire!
- W
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager