Django avancé : ORM, tâches planifiées et CSV
Session du 20 octobre 2022 à 20h00
Bases de données
Développement Web & Frameworks
Bases du Langage
Librairie Standard & Modules
Fichiers & Système
Veille & Discussions
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Django avancé : ORM, tâches planifiées et CSV
Session de questions / réponses.
Sujets abordés :
-
Bases de données avec Django
-
ORM
-
Cron / cronjob / Celery
-
Debug d'une application Django
-
Les exceptions
-
Lecture d'un fichier CSV et de grandes quantité de données
00:00:00 :Voilà, bonjour la Corse. Et les autres d'où vous venez?La région parisienne, ça c'est toujours le bonheur des webinaires, c'est qu'on voyagedu Seuldorf, carrément en Allemagne, c'est parfait.
00:00:27 :D'accord, le nord, oui. Dans la semaine prochaine, je pars au sud.Et t'es d'où en Suisse?Moi je suis du centre de Fribourg, sur la frontière linguistique entre le françaiset l'allemand. Donc à une vingtaine de minutes de la capitale, Bern.
00:00:55 :Ok.Voilà, je crois qu'on a...Bon, ça a l'air, mais appartement très cher, assurance très chère et plein de chosestrès chères, donc c'est pas forcément représentatif.
00:01:19 :Mais certes, avec le cours actuel de l'Euro, c'est très avantageux de voyager en France.Non, mais bon, entre eux, c'est finalement des prix suisses, donc c'est même pas beaucoupplus cher qu'ailleurs.
00:01:45 :Ah ouais, d'accord, je pensais que c'était plus cher.C'est vraiment un petit peu plus cher. On peut se dire que c'est un petit peu comme
00:01:55 :si on va à Cannes sur la croisette ou bien à Paris. Finalement, Paris, c'est relativementcher aussi.Ah oui.Voilà, je crois qu'on y est avec pas mal de monde.
00:02:12 :Donc bonjour à tous.Pour ceux qui ne connaissent pas, c'est vrai que j'ai été un petit peu absent au moisde septembre de par mes projets personnels.
00:02:24 :Donc je m'appelle Thierry.Je suis là sur Dockstring en invité permanent, c'est-à-dire que je suis enseignant dansune université à Fribourg en Suisse où j'enseigne Python à des jeunes ingénieurs.
00:02:38 :Et puis j'ai été un mentor Open Classrooms entre 2017 et 2020.Et depuis 2020, je suis à mon compte et je suis formateur.Je forme des entrepreneurs et des développeurs Python, en fait, sur des sujets plus avancés,puisque souvent sur le net, on va trouver essentiellement plein de ressources pour
00:02:57 :débutants, ça, ça ne manque pas, mais on a souvent au stade où on commence à vouloiravancer, on est un petit peu limité dans les bonnes ressources précises qui n'intuitpas d'erreurs.
00:03:11 :Donc souvent, j'essaie de promouvoir un certain nombre de bonnes pratiques dans la programmationPython qu'on ne retrouve pas dans les tutos de débutants.Alors aujourd'hui, on est un petit peu un public très mixte.
00:03:25 :Si j'ai bien compris, il y a des gens qui viennent de commencer la formation sur Dockstring.Il y a des gens qui sont déjà plus avancés, qui ont déjà fait Python et du Django.
00:03:36 :Alors il y en a qui également sont plutôt sur la programmation d'interface graphiqueavec PyCutie ou bien PySide.De mon côté, je suis essentiellement développeur Python et développeur Django.
00:03:50 :Donc c'est surtout sur ces thématiques-là, sur les bases de Python, les fondamentauxde Python, sur les débuts en Django, par exemple, que je peux vraiment être une aide,je pense.
00:04:01 :Donc n'hésitez pas, si vous avez des questions sur votre démarrage en Python, à les poser.Aujourd'hui, il n'y a pas de programme particulier, vu que j'ai été prévenu hier de ce liveet de l'impossibilité pour Thibaut Dessla.
00:04:13 :Donc n'hésitez pas à poser vos questions, soit en allumant votre micro et en la posantdirectement, soit via le chat.Et j'essaierai de prendre quelques questions justement, puis d'élaborer autour.
00:04:27 :On n'aura peut-être pas le temps de tout faire, en fonction du nombre de questions,mais on va essayer de faire au mieux.Donc qui se lance en premier pour une première question?
00:04:39 :On a une petite, si personne...Il faut toujours commencer quelque part, donc c'est parfait.Juste une question, parce que moi, vraiment, je débute, je suis assez à l'aise avec l'informatiqueen général, mais Python, je commence.
00:04:52 :A partir de combien de temps tu peux dire que tu deviens à l'aise avec Python?Alors, c'est toujours difficile de répondre clairement à cette question.
00:05:01 :Alors, avec Python, le langage lui-même, c'est pas forcément très long.C'est pas forcément très long, parce que finalement, on aura tendance à dire que lelangage lui-même, c'est à la limite la partie facile.
00:05:15 :Tu apprends un langage, alors c'est clair qu'au début, t'es un petit peu pas très à l'aise,parce que tu dois apprendre un grand nombre de fonctions, de syntaxes.
00:05:22 :Mais, assez vite, ça va vraiment rentrer dans les doigts, particulièrement parce quePython a une syntaxe relativement intuitive, relativement proche du langage parlé,et un petit peu moins verbeuse que certains autres langages de programmation.
00:05:37 :C'est-à-dire que souvent, tu peux exprimer plus de choses en moins de lignes de code.Donc, de ce point de vue-là, tu devrais prendre assez rapidement.
00:05:45 :Ce que j'ai pu remarquer depuis quelques années où j'enseigne à des adultes en reconversion,c'est que souvent, la difficulté intervient pas tellement au niveau de Python,mais plutôt, une fois que je parle Python, qu'est-ce que je fais lorsque j'ai un problème à résoudre?
00:06:02 :J'ai une page blanche ou un fichier.py blanc, et que je dois écrire, par exemple,les premières lignes de mon algorithme quand je résous en exercice, ou quand je résous en test technique,ou alors quand je m'attaque à mon projet.
00:06:17 :Et c'est souvent cette étape-là qui n'est pas facile.Et ça, c'est pas du tout lié à Python, en fait.C'est-à-dire que souvent, cette démarche de résolution de problème,on va y être confronté, qu'on fasse du JavaScript, qu'on fasse du Go, qu'on fasse du C++.
00:06:33 :Et donc, la solution à un problème dépend pas du langage,mais après, le langage va nous permettre de l'exprimer dans une syntaxe en particulier pour l'exprimer à l'ordinateur.
00:06:46 :Alors souvent, c'est plus dans ce registre-là que peinent les personnes débutantes.C'est-à-dire que tant qu'on reproduit des choses qu'on voit au cours, des tutos pas à pas,par exemple, je sais pas, réaliser sa première application Django de A à Z,on va suivre le cours de Thibault, et puis on va faire son programme d'e-commerce ou son blog en suivant pas à pas ce qu'il fait.
00:07:15 :Donc ça, ça va en général.Et puis on peut l'appliquer à Python, pareil, les bases de Python, on suit Thibault, et ça va.Mais la difficulté, ça peut être effectivement que tu dois résoudre soit un problème que tu as déjà vu, mais qui se pose différemment,soit que tu dois résoudre un tout nouveau problème que tu n'as jamais vu.
00:07:33 :Et la mauvaise nouvelle, en fait, c'est que dans la vie du développeur, de manière générale, c'est le cœur du métier.C'est-à-dire que finalement, tu vas toujours devoir résoudre un problème pour lequel tu n'es pas expertet pour lequel tu découvres une certaine partie de la chose.
00:07:49 :Et ça, ça s'apprend sur la longueur, mais on a des stratégies pour rendre cette étape plus facile.Donc je dirais que Python lui-même, tu peux l'apprendre, si tu as les bonnes ressources, si tu es bien guidé, en quelques semaines,quelques mois, ça dépend toujours du rythme auquel tu apprends.
00:08:09 :Mais de nouveau, ce n'est pas parce que tu connais très bien Python sur le bout des doigts que tu vas, par exemple,tu verras un exercice et puis tout d'un coup, tu auras l'étincelle qui te dit « ah ben ouais, pour cet exercice, je dois faire exactement ceci, ceci et ceci ».
00:08:24 :Ça, c'est une compétence qui ne dépend pas que de Python, mais qui dépend de à quel point tu es à l'aise pour formaliser un petit peules étapes de résolution du problème, un peu de ton expérience aussi, parce que l'expérience, c'est finalement avoir déjà rencontré plein de problèmeset puis pouvoir les transposer à la situation qu'on est en train de rencontrer. Donc là, il faut un petit peu plus de temps.
00:08:58 :Et le truc que je propose généralement, c'est de ne pas hésiter à s'entraîner sur des petits exercices.Alors, tu as Dockstring. Il y a beaucoup d'exercices sur Dockstring. Tu as également des plateformes comme France IOI ou Coding Game
00:09:12 :ou ce type de plateforme-là. L'idée, c'est qu'ils proposent des exercices que tu peux résoudre, on va dire, entre 10 minutes et une heure.Ça va dépendre de l'exercice, ça va dépendre de toi. Et c'est un petit peu comme le footing où vous allez courir.
00:09:38 :Mais si c'est quelque chose que tu fais fréquemment, tu vas pouvoir courir plus longtemps et plus long.Alors là, pareil, si tu t'installes une routine, c'est-à-dire, ok, je débute, mais je prends des petits exercices et j'en fais tous les jours.
00:10:05 :Et quand tu résouds un tel exercice, idéalement, c'est mieux de ne pas aller sur Google et Stack Overflow pour essayer de trouver une solution,mais c'est de prendre un papier, un crayon, et puis de vraiment essayer de faire l'effort de résoudre le problème et de se dire, voilà,comme une recette de cuisine, comment est-ce que je résoudrai ce problème si je devais le faire à la main? Et puis, une fois que j'ai une procédure qui colle bien,
00:10:54 :qu'ils mènent depuis que je suis là et puis qu'ils veulent en faire peut-être leur entreprise, donc c'est plus long. Mais l'avantage des petits exercices,c'est que tu en fais chaque jour en différent. Et l'idée, c'est de partir chaque jour d'une feuille blanche et puis de devoir faire ces étapes.
00:11:09 :Et si tu fais ça bien, très vite, tu vas progresser.Voilà, dans les autres, est-ce qu'il y a du coup des questions qui sont apparues dans le chat? Si jamais j'en loupe dans le chat, n'hésitez pas à enclencher le micro
00:11:28 :pour certains et puis vous exprimer. Même si vous n'avez pas de vidéo, n'hésitez pas à même utiliser simplement le son intégré de votre ordinateur.Il n'y a pas de souci, on n'est pas là pour commercialiser la vidéo de toute manière. Donc le son et sa qualité à une question.
00:12:32 :à ne pas trop gérer les données de ta base de données par des programmes externes et à utiliser l'ORM de manière systématique.Mais si tu veux pouvoir en tout cas le faire et interagir, probablement que tu n'as pas besoin. Alors ça, c'est une question qu'on peut se poser.
00:13:12 :ou en tout cas la manière de procéder la plus idiomatique en Django, ou la plus, alors en Python, on dit « Pythonique », alors je ne sais pas si en Django,on peut dire « Djangonique », mais je vais essayer de partager mon écran sans arrêter la vidéo. Je découvre « Whereby », donc soyez indulgents.
00:13:34 :Et là, est-ce que quelqu'un qui a le son peut me dire s'il voit en Google?Oui, on voit en Google. Ok, donc moi que je suis en partage d'écran, je ne vois pas le chat, donc simplement n'hésitez pas à prendre la parole.
00:13:56 :Donc ici, on va partir de la doc de Django. Django ici, puis on va faire des commandes personnalisées, « Custom Commands ».Ici, il y a le lien « Autocreate Custom Django Admin Commands ». Ceux qui ne sont pas trop à l'aise avec l'anglais peuvent toujours, dans la doc de Django,
00:14:20 :l'avantage c'est qu'on peut passer ça dans n'importe quelle langue. Alors pour ceux qui sont moins avancés, qu'est-ce qu'on va chercher à faire ici?On aura un site web programmé en Python, ici avec le framework Django. Ok, donc le site web, ça va donner un site web comme celui qu'on a devant nous,
00:14:52 :par un autre site. Alors comment on fait? Ce que je propose, donc à la personne qui a posé la question, c'est la chose suivante.On peut programmer des commandes Django. Donc pour ceux qui ont déjà fait du Django, je m'excuse pour les autres qui n'ont pas encore fait,
00:15:29 :Donc l'idée c'est d'ajouter notre propre commande. D'ajouter notre propre commande pour faire quelque chose en Django. Alors cette commande on pourraitl'apporter par exemple « import mydata » par exemple. Dans ce cas ça donnerait une commande « Python manage.py import mydata » et dans cette commande
00:15:49 :on fait ce qu'on veut. Alors ici de quoi il s'agit? Donc finalement ici on a l'architecture dans le projet Django. Pour les autres,ce que vous faites finalement en projet Django, c'est finalement du Python. Donc pour vous, c'est peut-être juste un petit peu complexe si vous démarrez Django
00:16:05 :cette semaine parce que du coup, si vous démarrez Python cette semaine parce qu'on se retrouve du coup dans un projet qui typiquement a de nombreuxrépertoires et de nombreux modules. Donc ici, qu'est-ce qu'on voit? On voit une application qui s'appelle Pulse avec différents modules Python qui sont classés
00:17:33 :Alors, pour ceux qui commencent Python, de nouveau, ça peut avoir un effet un peu déstabilisant puisqu'on parle ici de classe, mais ne paniquons pas,on peut vraiment reprendre ce squelette ici et le copier dans son propre fichier. Alors qu'est-ce que ça dit grosso modo? Ça dit qu'on veut créer une nouvelle commande.
00:18:24 :Donc, tu prends le programme que tu as créé et éventuellement, ce programme, tu peux remettre le code là-dedans ou remettre du code similaire là-dedans.Ça, c'est une possibilité. Si tu ne veux pas réadapter le programme pour qu'il s'exécute dans le contexte d'une telle commande, tu peux toujours utiliser un module de la
00:18:49 :bibliothèque standard de Python pour exécuter un programme externe. Donc ici, on peut se rendre sur la doc de Python, docs.python.org,une page que je vous recommande de tous bookmarquer, même si vous débutez en Python. C'est la documentation officielle que vous pouvez tourner en français.
00:19:30 :qui permet d'exécuter un programme externe. Ici, hop.Donc, tu t'es écrit dans docs.python et après tu as été dans quoi, excuse-moi?Docs.python, ici. Et puis après, références de la bibliothèque.
00:19:50 :Ok, merci.Dans références de la bibliothèque, tu trouves pas mal de choses sur les fonctions natives et puis les types, comme les chaînes de caractères, les listes, etc.
00:19:59 :Mais tu trouves également tous les modules que tu peux importer.Alors, ici, hop.J'ai juste un petit blanc, donc je parcours pour voir où est le...
00:20:18 :Sinon, je te le retrouverai. Donc, je ne sais plus qui a posé la question.Je remonte un petit peu le fil, c'est Eric. Eric, je te retrouverai la commande qui te permet d'aller chercher et d'appeler en fait un programme externe dans ta commande, éventuellement.
00:20:39 :Donc ici, tu vas soit mettre le code de ton programme Python actuel, soit tu vas pouvoir appeler ton Python actuel.Alors ça, je dirais que vraiment d'appeler le programme Python que tu as fait, c'est, à mon avis, sous-optimal.
00:20:55 :Parce qu'il va essayer d'apporter les données et d'aller lui-même les ajouter dans la base.Et autant que faire se peut, il serait bien que tes données ne soient pas directement ajoutées dans la base, par exemple si c'est du MySQL ou du SQLite, par du SQL,mais vraiment que tu utilises l'ORM de Django, comme on a là. Et ça, tu peux le faire directement dans cette commande, mais probablement dans ton programme externe,
00:21:21 :tu n'utilises pas l'ORM, à moins que je me trompe.Donc, regarde du côté de Custom Management Command. N'hésite pas à implémenter un petit essai là-dedans, et puis à la limite, pose une question dans le forum Django de RocketChat.
00:21:39 :Et puis on peut toujours regarder un petit peu plus en détail ton code.Est-ce que j'ai répondu à cette question, en tout cas provisoirement, sans perdre tout le monde?
00:21:52 :J'ai une petite question concernant justement ça, est-ce qu'il y a possibilité d'avoir des commandes automatiques, par exemple, à tous les heures,il valide, par exemple, les nouvelles commandes? Alors là, pour le faire, généralement, comme notre serveur va s'exécuter,
00:22:11 :en tout cas notre site web va s'exécuter sur un serveur généralement Linux, même s'il n'y a rien qui nous empêcherait de le faire sous un serveur Windows,sur Linux, on a Cron qui existe. Et donc, du coup, Cron, c'est un système, je vois ici, Samy qui écrit CronJobs,
00:22:30 :donc je ne sais pas si c'est toi, Samy. C'est moi qui ai posé la question, oui.Voilà, donc on peut exécuter cette commande, cette fameuse commande python-manage.py, le nom de la commande, on peut la faire exécuter dans un CronJob.
00:22:45 :La petite difficulté de configuration, en tout cas qu'ont rencontré certains étudiants qui s'y sont frottés, c'est généralement de savoir comment appeler la commande,tout en étant sûr qu'on a activé l'environnement virtuel du projet Django. Donc là, il faut l'avoir fait une fois, mais ce n'est pas très complexe à avoir.
00:23:05 :Donc ça dépend un petit peu de comment est-ce qu'on a créé cet environnement virtuel ou ce qu'il est stocké.Donc on doit un petit peu, dans le fichier de CronEdits, justement, mettre en place les choses de telle manière à ce que le bon environnement virtuel de Python soit utilisé
00:23:22 :lorsque j'exécute le CronJob. Mais c'est tout à fait possible de faire exécuter cette commande dans un CronJob.Il y a également un module qui s'appelle Django-CronServer, où on peut intégrer ça directement dans Python.
00:23:34 :C'est-à-dire qu'on va installer ce module qui lui-même va finalement contrôler les CronJobs de notre machine.Et puis dans le fichier de configuration de Django, dans le settings.py, on aura la possibilité de configurer la ligne de Cron qu'on va pouvoir faire exécuter
00:23:51 :et on va pouvoir lui dire exécute telle commande à intervalle régulier.Et puis du coup avec Cron on a vraiment cette possibilité de dire exécute toutes les heures, tous les jours, tous les jours à minuit, etc.
00:24:03 :Donc par exemple, si j'imagine que…Je pense que ça pourrait être intéressant d'avoir un article sur Doctrine directement qui parle un peu de ça un peu plus en profondeur ou avec des exemples concrets.
00:24:16 :Alors je vais le suggérer en tout cas à Thibault. Je sais qu'à l'époque où j'étais mentor chez Open Classrooms,il y avait un projet où des étudiants devaient faire ça et j'avais fait un GitHub d'exemples.
00:24:32 :Donc il faut que je remette la main dessus puis j'essaierai de le mettre déjà dans le Rocket Chat.Et puis pour la suite je suggérerais en tout cas à Thibault de peut-être de thématiser ça soit dans un cours Django, soit dans un plus petit tutoriel,soit dans un article de blog à voir comment c'est plus pratique pour lui.
00:24:52 :Ça pourrait être vraiment intéressant, oui. Merci.Voilà, ça c'est des fonctionnalités. C'est une manière light d'exécuter des commandes vraiment à intervalle régulier.Alors je dirais utiliser ça si vraiment on peut imaginer que certains utilisateurs se désinscrivent.
00:25:12 :On ne fait pas le ménage complètement au moment de la désinscription et puis qu'une fois par semaine,on veut lancer une commande qui va faire un certain ménage par rapport à la désinscription.
00:25:21 :Ça peut être aussi d'autres applications répétitives, mais dans ce cas, CRONTAB est bien.Si par contre on a des actions qui vont dépendre par exemple un utilisateur s'inscrit et on veut qu'une heure après qu'il se soit inscrit,il y ait quelque chose qui sera fait. Ou alors lorsqu'il.
00:25:38 :Effectivement je pense plus à ce type de processus pour exemple des CRM ou des gestions de clients,donc exemple validé si exemple le solde du compte est encore dans le positif par exemple.
00:25:50 :Alors moi j'utilise plutôt alors là du coup une autre solution qui s'appelle Cellery.Cellery c'est un système qui permet d'exécuter des tâches de manière asynchrone et qui permet de mettre en filou de programmer un certain nombre de tâches qui sont trop lentes pour être réalisées tout de suite
00:26:11 :ou alors qui ne peuvent pas être réalisées tout de suite pour une certaine raison.Tu as fait un paiement par exemple et tu vas attendre une certaine confirmation du processeur de paiementavant de pouvoir valider un abonnement ou un truc comme ça.
00:26:26 :Donc dans ce cas là.Est-ce qu'il y a des informations sur Dockstream?Alors il n'y a pas de formation sur Dockstream.Est-ce que c'est intéressant de travailler avec un des projets?
00:26:34 :Là on touche sur quelque chose de relativement plus avancé.C'est vrai qu'en français on a vraiment des difficultés à trouver.Ça va peut-être changer par l'avenir soit via Dockstream soit via mon blog ou autre.
00:26:50 :Mais on a des difficultés à trouver des ressources qui partent justement dans ce domaine où on est entre le débutant et l'expert.Donc on est déjà sur des sujets plus avancés.
00:27:01 :En anglais il existe un site qui est génial qui s'appelle testdriven.ioEt puis la technologie dont on parle s'appelle Cellery.Comme le légume.Et donc sur testdriven.io
00:27:22 :Alors à mon avis ils ont plusieurs choses.Il faudrait parcourir le site parce que le site vend des formations.Ce n'est pas forcément le but.
00:27:33 :Mais il y a aussi un blog.Donc on peut voir déjà les ressources qu'ils ont gratuits sur Celery.Tu trouves pas mal de choses également.
00:27:42 :Si tu tapes Python Celery ou Django Celery dans Google, tu vas trouver pas mal de choses.Je sais pas, je vais aussi remonter ça à Thibaut pour voir s'il a des plans par rapport à Celery.
00:27:57 :Comme je suis, je dirais pas directement dans le business Dockstream.fr.Je sais pas quels sont les plans par rapport à ces sujets plus avancés déjà.
00:28:08 :Mais en tout cas là tu as des mots clés je pense qui peuvent te permettre d'avancer.Ici par exemple Celery c'est aussi très utile.Ne serait-ce que si tu envoies en e-mail.
00:28:19 :Par exemple, typiquement je demande de changer mon mot de passe par exemple.Oui ça me fait penser un peu au job LQ avec les notifications dans la ravelle.
00:28:35 :Voilà, exactement.Je dirais que là on est pas tellement, alors on peut être effectivement sur la notification.Ça va être finalement le mécanisme inverse, c'est-à-dire que la tâche est faite,on a notifié l'utilisateur qu'elle a été faite.
00:28:50 :Et puis là du coup on peut voir, utiliser éventuellement un mécanisme de notification.Mais ce qui est essentiel c'est de se dire, ok, quand je consulte une page web.
00:29:00 :Excusez-moi, je vais juste éteindre mon téléphone.Mais dans Django, directement built-in dans Django, est-ce qu'il y a des...Alors directement built-in dans Django, on a rien non?
00:29:11 :Ah ok, parfait.Je dirais que c'est un petit peu la philosophie de Django qui embarque beaucoup de choses de basepar rapport à un framework comme Flask, par exemple, qui serait plutôt qualifié de micro framework.
00:29:26 :Mais sur les choses plus avancées, particulièrement sur les choses qui permettent de faire de l'asynchrone,c'est-à-dire vraiment de déléguer, de programmer des tâches qu'on va pas faire tout de suite,mais qu'on va faire un petit peu plus tard.
00:29:38 :Alors là, c'est la tâche de Sellerie, mais il y a également d'autres bibliothèques qui permettentde communiquer de manière persistante, par exemple avec le front-end.
00:29:48 :Je pense par exemple, si on veut faire un chat, par exemple,on veut que les messages puissent aller dans les deux sens vers le front-end.
00:29:56 :Là, je pense à une bibliothèque comme Django Channels, par exemple.Toutes ces petites applications très spécialisées demandent une bibliothèque supplémentaire autour de Django.Mais c'est des bibliothèques qui sont très matures et qui font partie de cet écosystème.
00:30:14 :Parfait. Merci beaucoup.Je vous en prie.Alors, je propose une question un petit peu plus débutante, méthodologie de débugage.Alors, méthodologie de débugage. Alors, vous m'excuserez les autres si je ne remonte pas.
00:30:30 :Je vois la question ici, donc si jamais vous me tapez sur les doigts après, puis vous remontez.Si vous voulez que une question soit prise pour sûre, vous prenez le micro.
00:30:39 :Et puis comme ça, je n'ai pas besoin de regarder dans le chat.Alors, si une exception est levée par l'app, ok.Alors, rechercher Google. Ok.
00:30:50 :Est-ce que ça suffit de rechercher dans Google?Alors, de manière générale, je dirais oui.Mais Google a un grand avantage, c'est qu'il vous connaît bien.
00:31:02 :Alors, ça peut être un désavantage comme un avantage, mais moi, quand je recherche une exception dans Google,je suis tellement souvent dans la doc de Django, que une des premières choses qui me retourne,et c'est pareil pour Python, dès que je mets un message d'erreur dans Python, il me retourne, tac, il devient direct sur la doc.
00:31:18 :Donc, c'est probablement pas le cas si vous débutez, et là peut-être on a un apprentissage du moteur de recherche Googlepar rapport à nos habitudes de recherche.
00:31:31 :J'ai notamment vu ça avec ma femme, quand elle cherche Python, Google lui donne des serpents,et quand je cherche Python, moi, j'ai 300 tutos de code.
00:31:43 :Alors, maintenant, pour Django, en fait, les exceptions suivantes vont avoir lieu,vont être parfois difficiles à débusquer, vu que si on est en production,elles vont donner lieu à une erreur 500.
00:31:58 :Vous êtes peut-être déjà tombés tous sur une page web,où quand on le consulte, on a une erreur 500, une page blanche, il n'y a rien qui se passe.
00:32:06 :Donc ça, c'est typiquement une exception qui aura probablement eu lieu du côté de notre site Django.Donc, en Python, c'est pareil, une exception va stopper le programme.
00:32:17 :Donc, ici, une exception ne va pas stopper Django lui-même, le serveur,mais une exception va couper, finalement, la requête de notre utilisateur.Quand on est en développement, du coup, on va voir cette exception.
00:32:29 :Alors, ce qu'il faut, c'est essayer d'identifier.Alors, une exception, je vais, juste après, je vais vous montrer,je vais redescendre au niveau tout débutant, d'accord?
00:32:39 :Alors, quand je dis débutant, je ne voudrais croiser personne,ce n'est vraiment pas un jugement de valeur, on a tous appris.Pas de problème.Des fois, ça vaut la peine de retourner sur les fonds d'affaires.
00:32:51 :Juste dans la foulée, comme ça, ça permet une bonne transition.Donc, Python, quand il rencontre des situations qui ne sont pas directement prévues,il va avoir un mécanisme d'erreur qui s'appelle l'exception.
00:33:05 :Et, quel que soit le programme Python, c'est pareil.Donc, Django, en particulier, c'est pareil, parce que Django, c'est rien d'autre que du Python.Donc, les exceptions ont un nom, et en général, de capture et excès.
00:33:19 :Le nom de l'exception devrait tomber sur ce qu'il a levé.Maintenant, je ne sais pas, Flavien, si tu as un exemple concret,par exemple, d'une exception sur laquelle tu aurais galéré particulièrement.
00:33:35 :Allo, vous m'entendez?Oui, alors maintenant, je sais comment la régler, mais ça m'a bien fait galérer,c'était le no-reverse match, ou no-reverse URL, je ne sais plus exactement,mais qui m'a bien fait un Django.
00:33:52 :No-reverse match, c'est généralement ça, j'imagine que c'est quand il ne trouve pasune URL à partir du nom que tu utilises reverse, c'est ça?C'est ça, et j'ai été l'utiliser avec les gabarits Django, et avec les gabarits Django,j'avais du mal à comprendre pourquoi il ne trouvait pas le chemin,
00:34:09 :et j'utilisais le mauvais nom, mais j'ai eu vraiment du mal sur celle-là.Ok, alors, il y a deux étapes, en général, effectivement.Il y a déjà, la première étape, c'est quand on n'a jamais rencontré une exception,et qu'on a un truc qui nous explose à la figure,et ça, peut-être que quand on débute en Python, ça doit aussi vous parler,
00:34:27 :ça je pense que vous avez déjà expérimenté les choses,et du coup il y a plein de lignes de Python qui s'affichent,et bien on se dit, oula, qu'est-ce qu'il fait?
00:34:39 :En fait, ce qu'on va voir, c'est que souvent il faut trouver le nomde l'exception qui a été levée.Il faut vraiment, dans ce cas-là, quand on a toute une trace d'erreur,tout un message d'erreur en Python, ce qui est important,ce n'est pas de commencer à lire depuis tout en haut.
00:34:57 :En tant que lecteur francophone, et non pas asiatique ou chinois,on a tendance, nous, à commencer tout en haut à gauche,et puis vouloir lire tout jusqu'en bas à droite.
00:35:11 :Non, alors, quand on lit une erreur, il faut vraiment aller tout à la fin,et puis regarder l'exception qui est notée.Alors, je vais essayer très artificiellement, je ne sais pas si vous voyez toujours en écran.
00:35:25 :Ici, vous devriez voir un truc avec co, pro, untitled, 442. C'est bon?Oui.Donc ici, si je code et que j'essaye consciemment de lever une exception,par exemple, levons une exception int, une exception ici, hop,remettre du texte avec une lettre.
00:35:56 :Donc on ne peut pas transformer une lettre en un chiffre.Qu'est-ce qu'une exception? Si j'exécute ça,il me faut un petit peu de temps à juste démarrer, parce que c'est dans mon navigateur,il va lever une exception de type valueError.
00:36:16 :Voilà à quoi ça ressemble, une exception.Donc généralement, code Python ou Django, finalement, va avoir quelque chose qui ne lui plaît pas.Il va donner une erreur avec un nom.
00:36:32 :Et puis là, si notre code est particulièrement grand,il va finalement remonter toute une chaîne.Alors je vais essayer de m'expliquer.Maintenant, si j'ai plusieurs fonctions,fonction1, puis la fonction1 va appeler une fonction2, par exemple,df, fonction2,puis on crée une troisième fonction, trois fonctions.
00:37:07 :Je vais volontairement créer une situation où la troisième fait quelque chose d'interdit.OK, transformer de nouveau notre lettre A en int, en entier, c'est interdit.
00:37:25 :Et puis ma fonction1, elle fait appel à la fonction2.Et puis la fonction2 fait appel à ma fonction3.Donc, qu'est-ce qui va se passer?C'est que si j'exécute 1 ici, si j'exécute cette fonction,ça va crasher parce qu'il y a une erreur dans la fonction3.
00:37:43 :Alors, regardons ici ce qu'il se passe si j'exécute ma fonction1.Exécutons ça.Et j'ai une stack d'erreurs.On voit que du coup, ma liste d'erreurs s'est allongée.
00:37:58 :On voit que j'ai appelé fonction1, puis fonction1 a appelé d'une manière ou d'une autre fonction3.On a commencé avec fonction1, puis d'une manière ou d'une autre, fonction3 a été appelée.
00:38:09 :Et puis c'est qu'à la fin, on voit l'erreur.Donc vraiment, cette erreur, il faut l'identifier.Et puis, ce qu'on peut voir ici, c'est Python, valueError.
00:38:22 :Et normalement, on va tomber relativement rapidement.De nouveau, je ne sais pas à quel point Google me connaît et me permet de trouver rapidement le truc.
00:38:31 :Alors là, il m'a mené directement sur la doc.Je retape donc Python, valueError.Il trouve le truc, il me donne une erreur.J'arrive sur la documentation, que je peux à tout moment passer en français.
00:38:46 :Et là, je peux même utiliser un ctrl-f pour faire une recherche, valueError.Et on voit que je tombe valueError ici, valueError ici.Je continue, j'ai exception valueError, puis il me dit dans quel contexte cette valueError est levée.
00:39:03 :Et ça, c'est applicable à Django.Alors du coup, Django, on peut essayer de regarder plus concrètement.Je vais aller là, on va, la fonction inverse de Django, puisque c'est cette fonction là qui a posé problème dans ce cas particulier.
00:39:27 :Django.Après, je me demandais également s'il existe des moyens de faire tourner Django avec un débuggeur,comme on pourrait le faire avec une note Python, comme avec PyCharm ou VS.
00:39:42 :Alors, tout à fait, en fait, tu ne le fais même pas tourner différemment que tu le fais pour un programme Python normal.Donc tu peux, bien sûr, que ce soit avec PyCharm, Visual Studio Code, ou même pratiquement, si on débug au terminal,c'est-à-dire qu'il y a un débuggeur intégré à Python qui s'appelle PDB, on peut mettre des breakpoints,
00:40:07 :donc des points d'arrêt dans le code, et bien sûr, aller chercher.Si on sait où c'est, on peut vraiment aller se mettre à son breakpoint.
00:40:16 :Donc là, toi tu es sur quel IDE?Moi je suis sur PyCharm.Je vais prendre ton nom, parce que je dois pouvoir te trouver assez facilement.
00:40:36 :Je pense que ça pourrait être intéressant de voir comment justement débugger une application,exemple avec Django en live, par exemple, un site web qui est en production par exemple.
00:40:48 :Alors on peut, mais là j'ai un petit peu peur que du coup on parte sur une petite...Ça pourrait peut-être être sur une autre session de Mentora.
00:41:01 :Je pense qu'on va le réserver pour une autre session de Mentora, éventuellement une session de Mentoraoù on annonce clairement dès le départ par exemple, que là on va faire du débug Django.
00:41:13 :Et là je vais en parler aussi à Thibault, pour qu'on dédie une session à ça.Parce que l'idée, si on part sur du Django avec quand même une partie des personnes présentes iciqui commencent tout juste Python, ça risque d'être indigeste.
00:41:39 :Donc je propose qu'on fasse ça, quitte à faire une session supplémentaire,c'est-à-dire hors du Mentora Live, pour qu'on se fasse une session de débug.Ça peut être avec moi, ça peut être avec Pyrélin ou avec Thibault.
00:41:54 :Ça jouerait pour vous?Ça sort des signes très intéressants.Donc moi j'ai des notes dans mon téléphone ici que je veux voir ça.Et comme ça, je vais pouvoir rebondir sur la question de Gabriel.
00:42:06 :C'est quoi une exception et puis comment est-ce qu'on les gère du coup?Alors votre écran est partagé, si j'arrête de le partager, voilà.Donc je veux juste voir, qu'est-ce qu'une exception et déjà comment est-ce qu'on la gère.
00:42:24 :Ça s'applique aussi à Django et puis on garde le débugage pour ce moment-là.Alors l'idée, comme on l'a vu, les exceptions, c'est des opérations qui ne sont pas prévues,qui ne sont pas normales pour une situation donnée.
00:42:44 :Par exemple, on a vu l'exemple que si on veut convertir une donnée en nombre, en entier,on ne peut pas lui donner du texte.Ça, ça semble relativement intuitif.
00:42:58 :Alors tout ça, ça s'applique à plein d'autres situations.Par exemple, si on veut rechercher ou ouvrir un fichier dont on donne le chemin,mais que ce fichier n'existe pas, alors il y a une exception.
00:43:17 :Alors qu'est-ce que ça va donner typiquement?Si on fait, par exemple, je vais même pouvoir le faire dans mon navigateur pour le coup.Là, on a vu une fonction où on essaie de convertir quelque chose qui ne joue pas,mais ici, si j'ouvre un fichier, on va juste l'ouvrir de manière très simple, comme ça, open,
00:43:38 :je donne un nom qui n'existe pas, n'importe quoi comme nom, juste essai.txt par exemple.Essai.txt, et puis je vais ouvrir le fichier en lecture.Donc ça veut dire que je présuppose que ce fichier essai.txt existe.
00:43:56 :Et je veux le lire.Alors ici, du coup, le fichier ouvert va se trouver dans ma variable fichier.Ou alors je peux, de manière plus pythonique, utiliser cette syntaxe en disantwithOpenAsFichier, donc exactement la même chose, simplement ce qu'il va faire ici,c'est qu'il va m'ouvrir le fichier, le fichier ouvert, il va le mettre dans fichier ici,
00:44:22 :il va me laisser faire des opérations là-dessous, une fois que j'ai fini,à partir du moment où mon code reviendra au niveau du with, il va automatiquementfermer le fichier, donc j'aurai pas besoin de fermer moi-même.
00:44:32 :Donc si j'exécute ça et que ce fichier n'existe pas, également, il va me donnerune autre exception qui est assez parlante, c'est FileNotFoundError.Donc l'idée de ces noms d'exception, c'est que le nom même de l'exceptionnous donne une indication sur ce qui n'a pas été.
00:44:49 :Qu'est-ce qui n'a pas été ici, qu'il a pas trouvé le nom du fichier.Ça veut dire qu'il a pas trouvé le fichier, puis il nous ditNo such file or directory, donc là, soit on comprend bien l'anglais,soit on peut prendre le texte et aller le coller dans deep.org ou.com,
00:45:09 :donc dans un traducteur automatique, c'est égal, mais vraiment,il dit qu'il n'a pas trouvé le fichier.De nouveau, je regarde pas tous ces détails qui peuvent avoir un effet anxiogènequand on voit l'erreur qui est là, et au début, on a l'impressionde rien comprendre, même s'il nous dit exactement où a lieu l'erreur.
00:45:29 :Mais vraiment, on va à la fin de l'erreur, et on va lire cette exception-là.Et puis, comment faire que finalement ces exceptions soient gérées,comment gérer une exception?
00:45:39 :Alors, on gère une exception à l'aide de deux mots-clés,try et except.OK?Donc comment ça se passe?Ici, je vais lui dire, essaye d'ouvrir le fichier sc.txt,
00:45:55 :et s'il n'existe pas ou si tu n'y arrives pas, fais quelque chose d'autre.Alors, comment est-ce qu'on pourrait faire ça?C'est qu'avant ce code, on va mettre en try,donc on lui dit vraiment d'essayer de réaliser l'opération.
00:46:09 :Comme toutes les opérations qui se terminent par un deux-points,on va devoir décaler d'une tabulation vers la droite le code pour lui dire,essaye de réaliser ces deux lignes de code,et s'il y arrive, très bien, il va continuer,mais s'il n'y arrive pas, il va lever une exception
00:46:27 :qui s'appelle final found error.Alors, il se peut que c'est la chose que je veuille,que c'est une zone close qui lève cette exception.Mais il se peut également que j'envisage la possibilitéque ce fichier puisse ne pas exister dans mon code,et que je veuille gérer le truc.
00:46:46 :Alors comment est-ce qu'on pourrait vouloir gérer le truc?Par exemple, je dis, s'il y a eu une exception,et que cette exception est un final found error,comme ça, donc si cette exception a lieu,deux-points, je vais lui dire de faire autre chose.
00:47:02 :Ici, je peux le faire en print, mais je ne sais pas où je vais le faire en print,je peux essayer d'ouvrir un autre fichier, par exemple,ou alors je pourrais essayer de rechercher les fichiers,ou de rechercher le fichier essay.existe dans un autre répertoire,
00:47:15 :et puis de l'ouvrir s'il est dans un autre répertoire, par exemple.Alors là, je vais simplement mettre, désolé,le fichier n'est pas disponible.Le fichier n'est pas disponible.
00:47:29 :J'exécute ceci, bien sûr, comme il n'existe pas ce fichier essay.txt,à ce moment-là, ok, il affiche ça.Par exemple, allons au bout de la démarche, ici,ici, je pourrais afficher le contenu du fichier, par exemple.
00:47:47 :Donc si je veux afficher le contenu du fichier,.read, voilà. Donc qu'est-ce que ça va faire?S'il existe, j'affiche le contenu du fichier,et s'il n'existe pas, il va lever une final found error,donc finalement, c'est comme si le code qui était làfait exploser une exception et on a besoin, nous, de l'attraper,
00:48:09 :ensuite au vol, donc c'est ce que fait tout ce qui est entre ce try et ce except,si le code qui est au milieu lève une exception,on peut préciser que si on rencontre cette exception-là,on va effectivement exécuter cette action.
00:48:25 :Et c'est ce qu'on voit, donc là, le code a levé une exception,donc c'est cette action qui a été exécutée.Mais s'il avait levé une autre exception, ici, si par exemple,on va ici faire,on va ici faireint a, qui était une autre exception, qui est du type valueError,
00:48:49 :on voit que du coup, l'exception, comme nous ne l'avons pas capturée,fait s'arrêter mon programme.Et puis vous pouvez donc y allervraiment à la suite, except valueError,ici,vous pouvez lister les choses qui peuvent arriver sur votre code.
00:49:13 :Ici, désolé,en entier, elle n'a pas pu être convertie.Dans ce cas-là, on voit qu'il y a une exception qui a eu lieudans mon code, pas normal, oh, mais j'ai prévu une situationdans ce cas-là, et on doit faire ceci.
00:49:37 :Je répète, on n'est pas obligé de faire des prints, on peut gérer l'exception.Parfois, gérer l'exception, ça veut dire avertir l'utilisateurqu'il y a eu une erreur et quitter le programme en douceur.
00:49:49 :Et parfois, gérer une exception, ça peut vouloir direrattraper le coup, je reprends l'exemple, je ne trouve pasessai texte, mais il peut éventuellement être dans un sous-répertoire,alors je peux éventuellement le chercher dans un sous-répertoire.
00:50:05 :Pour la gestion des exceptions, ici,maintenant, on peut voir que si du coup, ce essai existe,alors là, je suis sur une solution web qui permetde coder dans mon navigateur, donc si j'ajoute maintenantun fichier,nouveau fichier là, le fichier, je l'appelleessai.txt, et puis, à l'intérieur
00:50:33 :de ce fichier, je vais écrire bonjour tout le monde.Voilà.Donc j'ai, à l'intérieur de ce fichier, ajouté du contenu.Donc maintenant, le fichier existe. Donc,
00:50:49 :je n'ai plus de raison que ceci lève une exception,et c'est bien ce code là qui sera exécuté, et ensuite, il continueraici. Je peux mettre en print, pour que vous voyez ici,
00:51:01 :on continue.Et donc, si j'exécute ce morceau de code, maintenant,on voit qu'il va lirele contenu du fichier, rappelez-vous, à l'intérieur de ce fichier,j'ai écrit bonjour tout le monde,donc il va lire ce fichier, lire le contenu,afficher bonjour tout le monde, et puis, du coup, il va passer,
00:51:29 :il n'y a pas eu d'exception, donc il ne va pas exécuter ce code, et il va continuernormalement, comme s'il n'y avait pas eu d'erreur.
00:51:37 :Donc, c'est ça, j'ai réuni l'exception. Et finalement,je peux, voilà, je pense que c'est bon. Est-ce que,à ce niveau là, ça répond à la question de Gabriel?
00:51:49 :Oui, carrément, en fait, si tu as sorti l'erreur, si il y en a une.C'est cool. Je n'ai pas encore eu d'information,mais du coup, là, je crois que j'ai bien compris.
00:52:01 :Au début de la formation, tu vas rencontrer surtout des exceptions en tantqu'utilisateur, c'est-à-dire que toi, tu vas coder,il y a des choses que tu ne vas peut-être pas faire comme il faut,et il va y avoir une exception. Donc, quelque part, tu vas subir
00:52:17 :les exceptions. Et quand tu vas subir ces exceptions,tu vas peut-être noter, ok, telle situationa amené à telle exception.Et puis tu vas commencer à te demander, bien sûr, quand tu vas coder un programmequi a peut-être pour objectif d'être utilisé par des gens, peut-être même ces gens,
00:52:37 :c'est toi, si tu vas coder un programme, tu ne voudras pas qu'il cracheà chaque fois qu'il y a quelque chose d'inattenduqui est rencontré. Donc, dans ce cas-là,
00:52:49 :tu vas essayer de noter les exceptionsqui ont lieu dans certaines situationset tu vas te demander, est-ce qu'il faut que je les gère?Parce qu'il ne faut pas tout gérer.
00:53:05 :Je dirais parfois,quand quelque chose est vraiment inattendu, la meilleure chosequi puisse arriver, c'est que le programme crache.Je vois des gens qui font ça souvent. Alors, je vais remettre le partage.
00:53:21 :Ça, c'est l'erreur qu'on faitsouvent avec les exceptions quand on débute.C'est quand on fait des choses et qu'il y a parfois des erreurs,ce qu'on a tendance à faire, c'est qu'on met en try,on met du code au milieu, et puis à la fin,on met une sorte en except, mais on ne met pas de nom d'exception.
00:53:45 :Et puis,on va mettretout va bien.Quand on fait ça,qu'est-ce que ça veut dire? Ça veut dire, essaye d'exécuter ce code,et s'il y a quoi que ce soit qui ne va pas, capture n'importe quelle exception.
00:54:09 :Alors, quand je mets except sans rien mettre ici,ça veut dire n'importe quelle exception, je la capture.Et ensuite, tout va bien, je continue ni vu ni connu.
00:54:21 :Dans ce cas-là, ça, c'est quelque chose qu'on considèrecomme une mauvaise pratique. Pourquoi on considère ça comme une mauvaise pratique?Parce qu'en fait, on captureles erreurs dont on est au courant. Alors ici, on a notre fonction
00:54:37 :d'ouverture de fichier. On a très vite compris que si le fichier n'existait pas,on allait voir une exception. Mais, il y a peut-être plein de choses
00:54:45 :à laquelle vous n'allez pas penser. Et une chose à laquelleon n'a pas pensé, la meilleure des choses, c'est qu'une fois ça vous arrive,et le fait que ça vous arrive, ça vous permettrad'y penser. Donc, si systématiquement, chaque fois que vous mettez
00:55:01 :quelques lignes de code, vous mettez un try, except ici, ça va êtreune sorte de trou noir à toutes les erreurs, et quoi qu'il arrive,finalement, tout va bien se passer, et puis on ne va rien voir.
00:55:13 :Le pire que je pourrais faire, si je mets except ici, et puisvous avez peut-être déjà vu ce mot clé passe qui dit « Fais rien ».
00:55:21 :Si il y a quelque chose, tu ne fais rien. Si je fais ça, hop, on continueici. Bonjour, on continue ici. Même si mon fichier n'existe pas,
00:55:29 :alors là il existe en l'occurrence, mais je peux, pour le coup, le supprimer.Voilà, j'ai supprimé mon fichier.Alors, malgré le fait qu'il n'existe pas, j'ai fait un try except,et puis là, finalement, mon code prétend que tout va bien,alors que tout ne va pas bien. Parce qu'il a
00:55:49 :capturé absolument toutes les erreurs.Ici, si je capture une valueerreur,au moins, et puis si j'estime que le code ici valever une valueerreur, et puis du coup il lève une FileNotFoundErreur,normalement, ce qui est bien, c'est que j'attends, c'est que là,il me casse le truc, quoi. On dit que si j'ai prévu qu'il allait faire
00:56:13 :une FileNotFoundErreur,dans ce cas, il passe tout droit, parce que j'ai prévuça, et puis là, je lui ai demandé d'ignorer cette erreur. Donc,de nouveau, en Python, explicit is better than implicit.
00:56:29 :Ça, c'est ce que dit la PEP20, ou ce que dit l'importthis,si vous faites ce genre de choses, importthis ici.Vous voyez, c'est ce qu'on appelle le Zen of Python. Et puis, ça, c'est
00:56:41 :les 10 commandements, mais en fait, il y en a plus que 10, les 10 commandementsde Python. Et puis, dans ces commandements, il y a
00:56:49 :explicit is better than implicit. Donc, vraiment, quand je gère les exceptions,j'essaie d'imaginer qu'est-ce que mon code pourrait avoircomme situation non conventionnelle,et puis, je vais penser à des trucs, alors FileNotFoundErreur, et puisd'autres, except, là, on pourrait imaginer d'autres choses. Et puis,
00:57:09 :je vais gérer ce à quoi je pense, maisce à quoi je ne pense pas va effectivement faire stopper le programme.Donc, voilà, c'était très rapidement quelques petits éléments pourvous aider à commencer à gérer vos erreurs de manière confiante.
00:57:25 :J'espère que ça vous aidera à avoir quelque chosede plus, je dirais déjà, plus proched'un programme qui ne crache pas à la moindre opportunité, maispetit à petit quelque chose de plus contrôlé qui vous permette de gérer des situations inattendues.
00:57:41 :Alors, est-ce qu'il y a des exceptions? Alors, je reprends le fil.Message supprimé, c'est des choses que l'on peutfaire avec des ifs aussi. Alors, oui, c'est des choses qu'on peut peut-être
00:57:57 :faire avec des ifs si on a une fonction quiretourne en code d'erreur, par exemple, ou qui retourne quelque chosequi nous permettrait d'identifier cette erreur. C'est-à-dire qu'après, on pourrait
00:58:09 :dire si la fonction a retourné telle valeur,à ce moment-là, ça ne s'est pas bien. OK? Vous pouvez imaginer une fonctionqui va retourner non dans des situations d'erreur et puis qui varetourner un autre résultat dans des situations de succès. À ce moment-là,
00:58:25 :on pourra gérer avec des ifs. On va direque ça, c'est une situation qu'on peut rencontrer, par exemple,si on veut étendre dans les exercices pourdébuter en Python, on retrouve assez fréquemment, par exemple,des situations comme celle-là, où on vademander à l'utilisateurde nous donner un message.
00:58:53 :Un input, par exemple.« Quel est votre âge? »« Quel est votre âge? » Et puis ici,l'utilisateur va répondre. Et puis, ce qu'on voit
00:59:13 :parfois, c'est des gens qui vont « âge » égale« int » et qui tout de suite vont mettre « userInput ». Ça, c'estdans le meilleur des cas. Certains vont même carrément mettre le « int » ici, ce qu'il ne faut jamais faire.
00:59:25 :Alors, qu'est-ce que ça va faire si j'exécute ce code?Quel est mon âge? Je vais lui indiquer45.Et là, bien sûr, je n'ai pas mis en chiffre. Donc, il a essayé de le transformer
00:59:41 :invalid, donc « InvaluError » ici.Donc là, c'est typiquement une exception qui a eu lieu.Donc, on pourrait ici dire« try »et puis on va faire quelque chose, on va faire une boucle.
01:00:01 :On va dire « boucler à l'infini ».Une fois qu'on est dans la boucle, on va dire « essay »de demander à l'utilisateur quel est son âge. On va attendre sa réponse
01:00:13 :et puis, s'il y a une erreur, on va lui demander« except » par exemple« valueError »et puis là, on va lui demander et on va lui afficherun nomou donner l'âgesous formede nombre.
01:00:45 :Ok. Donc,il va le faire comme ça. Et puis, quand on a eu l'âge ici,on peut faire éventuellement, alors là, je ne passe pas beaucoup de tempsà ranger l'algorithme, je fais un break de manière un peu sauvage, il y a moyen de l'éviter.
01:01:01 :Mais on va le faire comme ça. Donc, voilà. Je rentre dans une boucleinfinie, je demande à l'utilisateur quel est son âge, et puis,s'il me donne quelque chose qui est ok, dans ce cas, je sors de la boucle.
01:01:13 :Et puis, on va sortir de la boucle et dehors de la boucle, on dit « votre âge print »« votre âge »et puis, voilà.
01:01:25 :Et puis, l'âge. Donc, si j'exécute ça,je rentre dans une boucle. Quel est mon âge? Je donne n'importe quoi.Il va me dire « non, donnez ça sous forme de nombre ». Ok.
01:01:37 :Je ne comprends toujours pas, alors je lui dis « 45 »et puis « non, donnez ça sous forme de nombre ». Ok. Et puis là, je vais donner sous forme de nombre.
01:01:45 :Il va être content et puis, il va m'afficher à la fin « votre âge »et « 45 », donc sortir de la boucle. Là, j'ai géré les choses
01:01:53 :sous la forme d'une erreur. C'est-à-dire que j'ai demandé, ici,je peux enlever ça, que je dis qu'il ne fallait pas faire. Donc, voilà. J'ai demandé quelque chose à l'utilisateur.
01:02:01 :Je transforme cette chose en entier et puis, puisquece qu'il m'a donné n'est pas valide, ça va lever une value-erreur.Donc, mon code, il va sauter ici, il va être capturé ici.
01:02:13 :Il va m'afficher ça et puis après, dans la boucle, on va retourner au début.On va redemander à l'utilisateur de me donner quelque chose.Il va me retourner et puis, tant que c'est faux, il va recommencer. Et quand c'est vrai, il va sortir de la boucle.
01:02:25 :Alors, ça, c'est une gestion d'erreurtypiquement avec les exceptions, mais comme il a été dit dans lemessage tout à l'heure, on peut faire ça éventuellement avec des « if ».
01:02:37 :C'est-à-dire que, ici, notre utilisateur vadonner quelque chose. Je peux tester avec un « if » par exemple.Je peux tester si ce qu'il m'a donné estune chaîne de caractère. Alors, je peux tester si « userInput », par exemple,
01:02:53 :utilise une méthode dans les chaînes de caractère,par exemple, « isDigit » ici, qui me dirasi l'utilisateur m'a donné des chiffres uniquement, alors ça, ça va êtrevrai. Et du coup, si c'est vrai, qu'est-ce qu'on fait?
01:03:09 :Si c'est vrai, on va transformer l'âge en « int », donc « userInput »et puis on va sortir de la boucle.Ici, « break ». Si c'est pas vrai, donc « else »,
01:03:21 :donc si « userInput » contient des lettres, à ce moment-là,on va afficher ici notre message qui dit, on a dit quoi, « donner sa sous-forme de nombre ».
01:03:29 :Donc, effectivement, en Python, il y a plusieurs manièresde faire la même chose. Je dirais que les exceptionsont une vision un petit peu plus moderne de la gestion d'erreuret dans certaines situations, ça permet de sphérifier la vie,mais c'est pas la réponse à tout et parfois, il peut
01:03:49 :être avantageux d'avoir un programme qui est structuré à partir deconditions. Ici, on va voir qu'on a exactement le même comportement.Je tape n'importe quoi, il va me dire « donner sa sous-forme de nombre »,et puis je donne 45 et ça va être bon.
01:04:05 :Donc, oui, le if est aussi une solution,mais pas toujours. Et l'exception n'est pas toujours une solution.Est-ce que j'ai répondu à la question?Franchement, c'était cool. Pour toute la situation, j'ai vraiment tout compris.
01:04:23 :Parce que c'est de mon niveau. Parfait. C'est un petit peuà cause de ça que je suis un petit peu récalcitrant à partir trop facilementsur du Django quand on a des différencesd'historique encore par rapport à Python qui sont très grandes.
01:04:39 :C'est toujours mieux si on veut avoir des sujets plus avancésde planifier en amont puis d'annoncer « aujourd'hui, ça va être une session plus avancée »puis peut-être on peut poser des conditions, c'est-à-dire par exemple dire« il faut avoir fait du Django pour accéder à ce mentorat »
01:04:55 :voire faire un mentorat supplémentaire justement pour cette session plus avancée.Mais j'espère que probablement ça se fera par la suite.Est-ce que vous avez d'autres questions?
01:05:07 :Voilà, donc je vois qu'il y a des personnes qui sont bons. Je ne sais pas combien de tempsfait Thibault habituellement. Là, on en a déjà pour une heure.
01:05:23 :Donc j'attends de voir s'il y a encore une dernière question.Sinon, on va gentiment s'arrêter.Donc ça semble bon.De toute manière, ce mentorat va se retrouver avec les autres. Il est enregistré.
01:05:43 :Donc il va se retrouver dans la liste des enregistrements qu'on peut regarder, qu'on peut surpasser.Et puis bien sûr, il y a encore le Rocket Chatoù on peut poser des questions. Donc ne pas hésiter. Je vois beaucoup de questions
01:05:55 :dans les salons Django, plutôt plus avancés.Mais également quand on suit des cours plus fondamentauxoù on a des fois des interrogations, on a essayé d'une choseet puis ça ne marchait pas, mais on ne comprend pas exactement pourquoi ça ne fonctionne pas.
01:06:11 :Parfois, il y a des mécanismes subtils en Python,même si on parle Python en tant que langage facile,il est parfois très subtil. Et ne pas hésiter,
01:06:23 :même quand on a l'impression qu'on est sur les premiers modules,à poser des questions dans le salon Python.C'est très volontiers, particulièrement de mon côté, j'adore répondre à ces questionssur les fondamentaux, parce que les fondamentaux construisent les briques pour la suite.
01:06:39 :Et on aura beaucoup plus de facilitéà aborder Django qu'on aura compris les mécanismes.Et très honnêtement, les mécanismes de Pythonpeuvent souvent se résumer, si on commence à avoir une vue d'ensemble,on peut vraiment résumer ces mécanismes sur une feuille à 4 recto versode notes. Au début, on a l'impression qu'il y a plein de choses qu'on doit apprendre
01:07:03 :par cœur, ou qu'on doit apprendre parce qu'il y a plein de fonctions qui viennent, mais ce qu'il faut savoir, c'est qu'il y a des principesfondamentaux qu'on pourra dégager,et c'est un petit peu en avançant qu'on voit ça.
01:07:15 :Mais pour avoir la chance de comprendre ces mécanismes un petit peu plus généraux,ne pas hésiter, si il y a quelque chose que vous ne comprenez pas, à poser.
01:07:23 :J'aurais peut-être une question, oui. En fait, la meilleurefaçon de pouvoir lire un fichier CSV qui comportepar exemple, mettons 500 000 lignes,exemple 50 000 lignes, 800 000 lignes, peu importe, 2-3 millions de lignes,la meilleure façon de pouvoir faire soit une loop à l'intérieurpour valider une information entre eux
01:07:47 :justement, donc, principalement dans une loop,mais ne pas nécessairement surcharger la mémoirequoi que ce soit, donc il y aurait peut-être une meilleure façon de gérer ça.
01:07:59 :Alors il y a vraiment plusieurs solutions en bidon pour lire des fichiersCSV. Et moi ce que je vois,c'est tout de suite les étudiants qui veulent lire un fichier CSV,parfois par une stack scientifique avec du Pandas par exemple, ou des choses comme ça.
01:08:15 :Pandas, quand on va finalement chargerdes données dans un CSV, par défaut, si on fait rien, il va chargertout le fichier. Alors évidemment, si c'est un petit fichier, c'est pas un problème. Mais si le
01:08:27 :fichier fait 800 000 lignes, alors ça reste encore, pas un énormefichier, mais on pourrait vraiment encore aller bien au-delà, et puis là ça tientplus facilement dans la mémoire de nos ordinateurs personnels.
01:08:39 :Si on n'a pas besoin de faire des statistiques avancéesou de la data. Alors maintenant, je dirais que ça peut être overkilld'utiliser des solutions data pour ça. Et moi ce que je
01:08:51 :ferais, et ce que je fais plus fréquemment, en tout cas pour mes besoins, moi je suisscientifique, donc je suis professeur à une école d'ingénierieà Fribourg, et donc,mon besoin, c'est de mettre data, mais parfois c'est plusdes modèles scientifiques qu'on utilise. Et
01:09:11 :le module CSV de la bibliothèque standard de Pythonva nous permettre de lire le fichier CSV ligne par ligne,et si on a besoin de faire éventuellement quelques comparaisons, on va pouvoir les lireéventuellement bloc par bloc, ligne par ligne, puis je mets en cache, je me souviensje vais stocker les lignes précédentes, par exemple, pour avoir les lignes
01:09:31 :qui répondent à une certaine condition, et puis de cette manière je vais pouvoircharger ligne par ligne ce fichier de 800 000 lignes en ayanten mémoire en permanence peut-être une, deux, dix,vingt, cinquante lignes. Donc ça va vraiment dépendre
01:09:47 :de l'application. Si j'ai pas besoin de fonctionnalitésavancées d'une bibliothèque scientifique, je peux me passer d'une solutioncomme Pandas. Après, dans ces bibliothèques de data science, il existe
01:09:59 :quelques solutions qui permettent de gérer justement ce type decomportement, puisque bien entendu, en data, on a très souventdes situations où on a des fichiers très gros.
01:10:11 :En ce qui me concerne, c'est pas souvent mon cas, nous on aon génère des fichiers de relativement petite taille,parce que la plupart du temps on va piquer nos données dans une base de données, donc on enregistredirectement les données dans du SQL, et avec le SQL, l'avantage
01:10:27 :de la base de données, c'est qu'on peut ressortir nos donnéesde manière assez préciseet du coup, quand on va chercher quelque chose comme information, on peutélaborer une requête qui nous la trouve de manière précise, ce qui fait qu'on a jamais besoinde charger en mémoire des grandes quantités de données. Mais effectivement
01:10:47 :ça peut arriver, alors dans ce cas là, il faut vraiment voirl'application et surtout, qu'est-ce que je vais avoir besoin de faire avec ces quelques donnéesen fonction de cette réponse, cette technique ou la méthode que tuutiliseras. Par exemple, dans la situation où les 800 000
01:11:03 :lignes doivent se valider entre eux autresdans le front d'enfleu. Alors, si elles doivent se valider entreelles autres, c'est à dire que finalement on doit pouvoir les avoiren mémoire si on veut pouvoir les comparer.
01:11:19 :Après, il faut voir, est-ce que dans ces lignes làil y a toutes les données qui sont nécessaires pour cette comparaison.On pourrait imaginer que dans ces lignes, il n'y a qu'une colonnedont on se sert pour la comparaison. Dans ce cas là, on pourrait déjà limiter les données
01:11:35 :en ne chargeant que cette colonne là ou que ces colonnes là, si c'estune comparaison qui utilise plusieurs featuresou plusieurs colonnes et faire la comparaison à ce niveau làidentifier l'index de la ligne, une fois qu'on a fait la comparaisonon a identifié ce dont on avait besoin, on peut aller rechercher a posteriori
01:11:55 :ces informations là. Donc de nouveau, si les comparaisonsimpliquent qu'on a besoin d'une ligne complèteet qu'on a besoin de comparer toutes les lignes entre elles,c'est difficile d'éviter d'avoir tout en mémoire.
01:12:11 :Mais je prends par exemple une situation oùj'ai besoin d'identifier des maximums ou des minimumssur différentes données, on a besoin de passer à travers toutes les donnéesmais on n'a pas besoin d'avoir toutes les données en mémoire. Parce que
01:12:27 :chaque fois qu'on en trouve un nouveau maximum on va pouvoir garder juste cette ligne. Donc en fait finalementla donnée qu'on va garder à ce niveau là, si on a besoin de faireune somme sur une colonne, on a besoin de passer à travers toutes les lignesmais on a besoin de garder l'état actuel de la somme.
01:12:43 :De nouveau, je vais pouvoir garder un minimum de données en mémoire.J'avais entendu dans d'autres langages des types de...Ok, j'avais entendu dans certains langages destypes de... Alors là il y a des choses, après c'est déjà plus mon domaine.
01:12:59 :Ok.Moi j'ai l'avantage d'avoir,quand ça devient plus spécialisépar rapport au big data, j'ai l'avantage de bosseravec des gens dont c'est le métier. Donc là c'est déjà
01:13:19 :ce que nous on appelle les data architectes chez nous,qui vont élaborer des solutionsen termes d'accès aux données qui nous permettront justementd'accéder de manière efficace à toutes ces données là.
01:13:35 :Donc après il faut vraiment voir que dans ce domaine de la data et du big data,on a vraiment plusieurs métiers. Dans ces métiers,il y a le data analyst qui va vraiment passer en revueles données, essayer de les faire parler, essayer de faire des représentationsqui permettront de les comprendre, de les mettre en perspective.
01:13:55 :Il y a le data scientist qui lui va plus s'occuper de la modélisation,création de modèles, entraînement et optimisation. Et puisil y a toute autre personne qui va s'occuper de l'infrastructure autour de ça, qu'on appelleraplus ou moins aussi un data architecte. Et puis, alors, si on travaille
01:14:11 :effectivement dans sa propre petite startup, on peut être amenéà faire un petit peu tout ça. Mais de manière générale, c'est des métiers quand même
01:14:19 :qui demandent des compétences de vol pour certaines choses.Bonne question pour Stéphane aussi.Alors Stéphane, j'ai deux fichiers qui...Ok.Ok, ces deux fichiers sont en volumeparticulier ou pas nécessairement?
01:14:47 :Là, ils sont de grand volume.Ok, donc là, on double le problème.1500 lignes, ça reste quelque chose qu'on peut éventuellementcharger en mémoire. Dans ce cas-là, soit
01:15:03 :si on travaille avec des data framesPandas, par exemple, on peut se permettrede rassembler les deux data frames, voire d'en créer un.Et puis, donc il faut voir de nouveaucomment, par quels critères on va faire correspondre ces différentes lignes. Mais en tout cas
01:15:23 :sur des petits sets de donnéescomme ceux-là, on n'a vraiment pas de problème à avoir les deuxdata sets en mémoire et puis de pouvoirtravailler avec ça et de pouvoir élaborer nos règles métiers qui permettrontde comparer ces différentes lignes et ces différentes colonnes.
01:15:43 :Donc, a priori, je ne vois vraiment plus les problèmes quand ontravaille à des gros volumes de données sur chacun de ces fichiers.Effectivement, là, si pourchaque donnée d'un fichier, on a besoin de les comparer avec des données d'autres fichiers, on dépasse mes compétencesà ce niveau-là. Mais sur un petit fichier comme celui-là,
01:16:03 :là, je chargerai vraiment les données, je ne me poserai pas de questions.À moins qu'on soit vraiment dans un environnement qui imposeun petit volume de mémoire, par exemple,sur de l'embarqué et tout ça, c'est vrai qu'on est moins souventplutôt confronté à ça, à part si on joue avec un Raspberry Pi ou
01:16:23 :un truc comme ça. Et puis même un Raspberry Pi aujourd'hui n'est plus aussilimité que certains ordinateurs de l'époque.Donc, nouveau, il faut vraiment voir l'application. Mais à priori,
01:16:35 :pour les volumes qui sont mentionnés ici, charger les deux fichiers à mémoire et puis faire ce qu'il faut.Est-ce qu'il y a d'autres questions?Là, pour ceuxqui n'ont pas encore parlé, il y en a plein que je n'ai pas vuparler. Je ne connais pas forcément le parcours de tout le monde
01:17:09 :et le profil de tout le monde. Est-ce qu'il y en a eu un petit peu pour tout le monde?C'est-à-dire, est-ce que vous soyez débutant ou mêmecarrément plus avancé? Est-ce que j'ai frustré quelqu'un?
01:17:21 :Donc, déjà,c'est bien d'avoir frustré personne.Y aura-t-il des modules Python?Des visio-computers?Qu'est-ce qu'on entend par visio-computer?Ici, d'analyse d'image ou bien?Je ne sais pas.
01:17:49 :Détection d'objets.Oui, il y a.Donc, il y a énormément de bibliothèquespour faire de la détection automatiqueet surtout dans les bibliothèques de Data Science. Donc, regarde du côté de
01:18:09 :Scikit-Image et des trucs comme ça.Également, il y a la possibilité d'avoir des modèles de reconnaissance.On fait de la reconnaissance faciale, des bibliothèques comme Keras, par exemple,qui sont, alors on a entendu parler, c'était vraiment des modèlesà base de ce qu'on appelle des neural networks, dont le but
01:18:29 :est de faire de l'apprentissage. Par exemple,faire de l'apprentissage à partir d'images aussi.Par exemple, Google Photos, par exemple,peut reconnaître des personnes.Je crois que ce n'est pas déployé en France. En Suisse, ça fonctionne, mais probablement au Canada aussi.
01:18:49 :Où on peut mettre Thierry dans son Google Photos et puis il vatrouver toutes les photos où j'apparais, sachant qu'il a une photoou deux où il sait que c'est Thierry qui est dessus.
01:19:01 :Donc, c'est la reconnaissance image. Bien sûr, ce n'est pas parfait.Ça demande aussi de l'entraînement, c'est-à-dire que ça demande des grandes sets de données pour qu'il arriveà reconnaître des objets. Mais c'est des choses qui,
01:19:13 :quand c'est bien entraîné, quand c'est pour une application spécifique, ça fonctionne relativement bien.Également pour la reconnaissance decaractères, simplement si vous faites des scansde documents PDF, ça fonctionne également comme ça. La reconnaissance de caractères, ce qu'on appelle
01:19:29 :OCR, il va regarder les caractères qui sont écritset puis reconnaître les formes de ces caractères et puis ensuite transformer le PDFen un vrai PDF où on peut sélectionner le texte, par exemple.
01:19:41 :Des bibliothèques de gestion et de reconnaissance d'objets,ça peut s'appliquer. Il y a même des bibliothèques qui permettent de faire du suivid'objets sur une vidéo et puis ça fait du tracking. Ça permet de
01:19:53 :vraiment suivre l'objet et pour certaines applications, ça peut être relativement utile.Donc, nous, on fait de la scienceplutôt mécanique des fluidesau boulot et on se sert de choses comme ça, par exemple, pour étudierle mélange dans une cuve. Alors là, ça ne vous passionne probablement pas, mais
01:20:13 :dans le genre réacteur chimique, quand on mélange une cuve, on vamettre éventuellement des billes colorées ou des choses à l'intérieur et puis on va pouvoir suivreces billes et en déterminer la vitesse et le parcours et puis par exemplereconstituer la trajectoire. Donc, il y a plein d'applications
01:20:29 :pour ce genre de choses et Python est bien doté dans ce genre de bibliothèque.Voilà, alors je vois qu'il y a moins de questions, maisn'hésitez pas de nouveau dans les salons,particulièrement dans les salons Python, où on peut vraimentposer des questions sur les fondamentaux. N'oubliez pas que
01:20:55 :je dirais la valeur ajoutée d'une formation comme ça, c'est pas d'apprendrePython, parce que si vous voulez apprendre juste la syntaxe de Python,il y a toute l'information sur le web, on trouve vraimenttoute l'information sur la syntaxe sur le web. La valeur ajoutée
01:21:11 :de ma perception à moi, c'est la communauté, c'est le faitde pouvoir interagir avec les autres, mais également interagir avecThibault, avec moi-même, avec d'autres intervenants, pouraller plus vite que ce qu'on ferait seul. Et donc,
01:21:27 :si on est confronté à des problèmes sur les fondamentaux,n'hésitez pas. Donc les questions, c'est pas que pourles questions avancées, c'est vraiment aussi pour les questions de base, il n'y a pas de questionsstupides, comme on dit, c'est pas juste un slogan, mais c'est vraiment quelque chosedans lequel je crois. On apprend beaucoup, justement, comme ça,
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite