Session du 11 juillet 2022 à 20h30
Pratique & Live Coding
Frontend & UI
Qualité & Architecture
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Revue de code d'une todolist Python
Découverte et analyse de plusieurs projets de todolist en Python, avec partage d'écran et retours concrets pour améliorer structure, lisibilité et fonctionnalités.
00:00:00 :Alors, est-ce que vous m'entendez? La caméra ne semble pas fonctionner. Je suis avec uneconnexion internet très très mauvaise. Ok, vous m'entendez, cool. Ah oui, c'est parce
00:00:35 :qu'il faut que je la change, ça c'est normal. FaceTime, non peut-être pas FaceTime. Non,si, ok, c'est bon. Voilà, donc, pas de cas, mais je pense que je vais la couper parce
00:00:48 :que comme je vous dis, déjà je ne suis pas bien coiffé et je pense que je vais économiserla bande passante. De toute façon, je vais vous partager mon écran et c'est ça qui
00:00:59 :va être important puisque là on va faire de la revue de code et l'important c'est surtoutque vous m'entendiez et que vous voyez l'écran. Bonsoir tout le monde, donc il y en a qui
00:01:10 :sont là pour la première fois si je ne me trompe pas. Alexandre, Jonathan, Arnold,Julien, il y en a qui sont là depuis un peu plus longtemps. Lionel, yes Lionel, c'est
00:01:21 :cool, t'es là, du coup on va pouvoir voir ton projet aussi puisque là on va voir lesprojets de Toodolist. Et donc Lionel, tu l'avais remis, je l'ai bien de mon côté. Donc on
00:01:34 :va pouvoir... et Lionel, ouais non c'est ça. On a plusieurs Lionel, je crois qu'on a troisLionel maintenant, donc ça se peut que je me mélange des fois, mais là je suis bienavec le bon Lionel qui m'a remis son projet. Donc ce soir, je ne sais pas si vous aviez
00:01:56 :vu un petit peu le programme, l'idée c'est... je vais vous partager mon écran tout de suite.On va faire un entire screen, petit effet escalier, voilà. Donc c'est ce projet, l'application
00:02:13 :Toodolist. Donc pour ceux qui ne sont pas au courant, je vais aussi faire un petit toursur Dockstring et je vais en profiter pour vous montrer aussi la petite nouveauté. Donc
00:02:30 :les projets, en fait c'est des projets, vous y avez accès ici, projets mensuels. C'estun truc semi-officiel qui est assez récent. Désolé pour les petits effets d'escalier,
00:02:40 :là je vais voir le chat de temps en temps, donc je n'ai pas de deuxième écran. Doncsi je reviens sur cet onglet, c'est vraiment pour voir les questions. Donc ce projet, enfin
00:02:53 :ces projets mensuels, c'est un truc que j'ai commencé il y a deux ou trois mois maintenant,puisque là on va faire le troisième. Donc l'idée c'est de vous proposer un projet
00:03:03 :tous les mois avec des consignes assez libres, donc un projet qui parfois est similaire àun projet qu'on pourrait retrouver sur Dockstring. Par exemple le mois d'avant on avait le jeu
00:03:16 :de rôle dans le terminal, qui est un projet que vous avez sur Dockstring. Le à to dolist il n'y en a pas, là j'ai fait une vidéo sur Youtube que vous avez peut-être vu, s'ily a quelqu'un qui veut bien mettre le lien qu'il a sous la main ou qui veut bien aller
00:03:31 :le chercher. Ah il y a David aussi qui nous a rejoint, salut David, David, Ousmane, Murielaussi, bonsoir tout le monde, salut Guillaume aussi. Donc voilà, moi j'avais fait mon propre
00:03:44 :projet qui était un petit peu différent de ce que je fais d'habitude, je ne sais passi vous avez vu la vidéo Youtube. J'avais failli le faire sous le format un peu classique
00:03:54 :avec des vidéos bien découpées, mais finalement je me disais que c'était plus intéressantde faire une vidéo sans montage, donc c'est un petit peu long, il y en a pour trois heures,trois heures trente peut-être à peu près, mais ça vous permet de voir vraiment toutela réflexion qu'il y a derrière, de voir les allers-retours qu'on ne voit pas forcément
00:04:10 :justement dans une formation, puisque une formation c'est préparer beaucoup à l'avance,donc j'aurais pu préparer tout bien découpé et vous donner l'impression que tout estfait directement sans aucune hésitation, mais c'est rarement le cas. Donc je pense
00:04:25 :que je vais faire ça sur les autres projets aussi, même si ça fait des vidéos assezlongues, je pense que c'est quand même assez intéressant d'avoir ça aussi en plus deprojets un peu plus découpés. Donc là ce mois-ci, en fait je fais un projet sur les
00:04:40 :mois de juillet et d'août, parce qu'on est un peu tous moins là l'été, on levoit pas mal sur la communauté, il y a moins d'activités, donc là je fais un projetvoilà date limite 1er septembre, c'est d'ailleurs un projet qui est un peu pluscomplexe, alors là encore comme je vous dis, c'est assez libre, vous pouvez faire des
00:04:59 :trucs très simples, si vous commencez avec Python vous pouvez vous contenter d'un trucen ligne de commande avec une cinquantaine de lignes dans ce cas-ci, donc l'idée c'estde créer une application de CRM de carnet d'adresse, donc je sais qu'il y a des gensqui vont partir dans des projets Django, complets avec des bases de données etc, mais si vous
00:05:16 :commencez vous pouvez très bien faire tout simplement un programme qui vous demanded'enregistrer des informations, qui vous demande des infos sur un contact, et vousenregistrez ça dans un fichier, ça peut être faisable assez rapidement si vous êtesdans le début de la formation.
00:05:32 :Voilà, merci Alexandre pour le lien vers la vidéo, avec cette magnifique vignette,donc voilà un petit peu pour l'explication de ces projets, donc il n'y a pas d'obligationbien sûr si vous faites ça, et l'idée c'est que je fasse des retours, pour l'instantil y a 4-5 personnes qui remettent les projets, donc j'ai pas encore fait les retours pour
00:05:55 :chaque projet, mais justement l'idée c'était Arthur qui je crois n'est pas là ce soir,qui trouvait que c'était intéressant aussi de faire ça en mentora, d'ailleurs n'hésitezpas si vous voulez intervenir, je crois que vous devez pouvoir participer, je sais jamais,au début, c'est bizarre, au tout début des mentora tout le monde était connecté
00:06:16 :par défaut, là je crois qu'il faut que vous vous manifestiez si vous souhaitez interagirde façon vocale. Alors pour Arnold, en fait normalement tu dois pouvoir remettre ton projet
00:06:32 :directement sur la classroom, donc le lien est sur votre tableau de bord, et moi je saispas si je, je pense pas que je sois dans les élèves, mais en fait vous pouvez, donc jesais pas si j'ai une vue d'élève, ajoutez un commentaire non? Mais normalement en fait
00:06:50 :t'es même pas obligé de passer par ton dossier Google Drive, tu peux juste me glisser, jevais te montrer par exemple sur les autres projets, application de toutes les listes,tu vois moi ça dépend, et tu vois Arthur il m'a remis directement un site web, doncil m'a mis l'URL directement et puis il y a le GitHub qui est associé, qu'il a mis
00:07:09 :directement ici, Lionel il m'avait mis un GitHub aussi, Laurent, Jonathan ils m'ontdonné des zip, donc t'as juste à déposer des fichiers et puis après je l'ai accèsautomatiquement. Et si jamais vous avez pas accès à la classroom, parce que je sais
00:07:23 :qu'il y a des gens qui avaient des problèmes pour se connecter, notamment si vous avezpas une adresse Gmail, je crois que Laurent avait eu des soucis, donc si jamais vous avezdes problèmes pour vous connecter à ça, n'hésitez pas à me le dire et puis on regardera.
00:07:36 :Donc voilà, j'avais tous ces projets, Lionel je l'ai téléchargé, on va regarder, c'estcelui là ici. Alors il y avait le projet de Laurent, je vais pas trop passer dessus
00:07:47 :parce qu'en fait c'est très similaire, il a refait la même structure en fait quela liste de courses, avec ce même principe d'ajouter des éléments dans une liste dechoses à faire, mais du coup je vais pas passer de temps dessus parce qu'en fait déjàc'est bien fait et il n'y a pas grand chose à redire et de toute façon c'est exactement
00:08:09 :la même structure et la même correction que la liste de courses qui est sur Doctrine.D'ailleurs petite précision aussi, j'ai pas encore, enfin j'ai la vidéo malheureusementavec les 3Mbps de la Bretagne pour uploader les 3 heures de correction que j'avais faitpour le projet d'avant, donc le jeu de rôle dans le terminal, c'est un petit peu long,
00:08:29 :je crois qu'il m'annonce 3 ou 4 jours d'upload donc je le ferai à la fin de la semaine,parce qu'en fait j'avais enregistré les corrections de tous les projets pour que vouspuissiez voir justement les corrections de chacun et je vais vous donner accès à çaprochainement pour le projet du jeu de rôle dans le terminal et je ferai la même chose
00:08:45 :pour les to-do list en plus de cette session de mentorat.N'hésitez pas si vous avez des questions, si vous souhaitez m'interrompre ou si voussouhaitez participer, parler, normalement vous devriez pouvoir vous me confirmer oupas, je crois que j'ai pas besoin de vous inviter à participer, vous devriez pouvoir
00:09:03 :vous manifester si jamais vous souhaitez intervenir en vocal.Dernière petite précision avant de commencer, désolé c'est un petit peu long, mais jevoulais vous prévenir, je sais pas si vous avez vu tous le mail qui annonçait le petitchangement à venir, donc ça c'est la version actuelle et du coup je vais changer de branche,
00:09:26 :parce que on refresh, et attention, donc ça change un petit peu, principalement au niveaude l'interface, c'est pas encore totalement fini, mais vous voyez que du coup quand vousêtes connecté ça va ressembler à ça, quand vous serez déconnecté il y aura toujoursla barre en dessus, mais bon généralement si vous êtes là c'est que vous serez connecté
00:09:54 :sur le site, donc l'idée c'est que vous avez une petite barre comme ça sur le côtéque vous pouvez collapser qui va prendre un petit peu moins de place, sur le reste c'esttout à fait similaire, vous avez les formations, les projets, tout ça, j'ai séparé un petitpeu les choses, voilà il y a les outils ici avec les notes, les favoris, le glossaire,
00:10:12 :les ressources, tout ça, et le gros changement c'est sur les parcours, en fait c'est quelquechose qu'on m'a beaucoup demandé et je suis content d'avoir réussi à le faire, c'estpas forcément évident, c'est que vous n'allez plus avoir à garder le plan de cours ouvert,par exemple si je clique sur l'article vous allez avoir des boutons à chaque fois pour
00:10:33 :revenir au plan de cours ou pour continuer à la prochaine partie, donc là vous voyezje continue, continuer, et à chaque fois vous allez avoir un bouton si on arrive àun moment sur une session comme ça, pareil vous allez avoir le bouton en bas pour continuer,quand vous arrivez à la dernière vidéo vous avez aussi le bouton ici, prochaine
00:10:49 :section du parcours, et comme ça vous n'avez plus besoin de revenir sur le plan de courset si jamais vous voulez voir où vous en êtes un peu dans le plan de cours, vous pouveztoujours revenir au parcours, et comme je vous l'ai dit tout ça est collapsable, donc
00:11:02 :ça vous permet d'avoir une interface assez épurée pour regarder la formation et sinonpour revenir sur les différents éléments. Donc voilà pour la petite nouveauté, je
00:11:11 :pense que je vais déployer ça dans le courant de la semaine, je suis en train de faire lesderniers tests pour m'assurer que tout est bon, et voilà. Ça va pour tout le monde? Pas
00:11:22 :de questions, pas de remarques ou autre? Tout est bon? Ok parfait, donc par quel projetcommencer? Par quel projet on commence? Donc Laurent comme j'avais dit c'est similaire
00:11:41 :aux autres corrections, donc il y a des questions sur le channel, Santiago je répondrai après.Donc le projet d'Arthur il est bien, il est assez complexe puisqu'il l'a fait avec Django,donc là vous voyez vous avez une to do list comme ça, donc là vous voyez Python PHP,ça sent le bootstrap derrière à la vue des boutons et des couleurs. Ah oui d'accord
00:12:17 :alors ça c'est des listes, parfait. Donc on peut faire par exemple une liste YouTube,on clique sur la liste et on ajoute des éléments. Ah oui il est allé vraiment loin. Donc voilà,
00:12:28 :regarder une vidéo avec le petit calendrier, parfait. Add element, ok. Alors au niveaude l'interface, là purement UX, le bouton ici, je pensais que ça allait rajouter uneligne de description, donc j'aurais plutôt mis ici en bas, avec le close peut-être àgauche et le add element à droite. Là on a envie de cliquer sur close pour ajouter
00:12:50 :l'élément mais ça ne le fait pas. Donc ouais je crois qu'il m'avait dit qu'il n'avaitpas tout terminé effectivement, parce que là on ne peut pas éditer une fois que c'estfait, on peut le valider par contre, ok super. Donc c'est comme je vous dis assez avancé,
00:13:05 :donc je pense qu'on y reviendra un petit peu plus tard, on va passer par les projetsun petit peu plus simples et après on passera sur le projet Django. Salut Yann, bonsoir.
00:13:14 :Alors ouais, on va prendre le projet de Lionel je pense. Donc le projet de Lionel, il y avaitle projet de Jonathan aussi, alors l'un ou l'autre, je pense que celui de Jonathanétait à peine plus simple, je l'avais ouvert dans PyCharm ici. Hop ça c'est Doctrine,
00:13:30 :voilà ça c'est celui de Jonathan. Alors Jonathan ouais, tu n'étais pas sûr d'avoirbien fait au niveau des classes si je ne me trompe pas. Je ne sais plus si c'était toi
00:13:39 :ou Lionel qui m'avait dit ça, puisque là tu as fait une classe effectivement ici pourgérer la liste. Alors tu ne me confirmes pas, ouais c'est ça Jonathan ok. Donc franchement
00:13:50 :c'est quand même bien, parce que ce qu'on voit souvent en fait dans les classes, c'estdes gens qui utilisent les classes pour faire du rangement en gros, c'est à dire qu'ilsne vont pas vraiment utiliser l'intérêt des classes, à savoir de pouvoir créer desinstances qui vont avoir des attributs différents etc. Ils vont juste en fait avoir une classe
00:14:11 :qui va contenir des fonctions, mais il n'y aura pas de notion de pouvoir réutiliseren fait différentes instances qui vont avoir différents attributs et donc qui seront différentesles unes des autres. Ça on peut le voir très facilement, là on voit que tu as pas mal
00:14:28 :de self, on voit que tu as ici dans le init plusieurs attributs, donc tu as la sauvegardeici, donc tu sauvegardes tes éléments sur une liste, enfin sur un fichier JSON, tu asle nom de la liste, tu as la liste en tant que telle qui est sauvegardée effectivement
00:14:43 :dans l'instance, donc là on voit clairement que tu pourrais à partir de cette classeliste créer plusieurs listes qui auraient des noms différents, qui auraient des élémentsdifférents à l'intérieur même de la liste avec un chemin sur le disque différent.
00:14:56 :Donc là on est clairement dans une bonne utilisation de l'Orient Objet parce que àpartir d'une même classe on va pouvoir faire plusieurs instances. Donc ça c'est parfait
00:15:03 :et comme je vous dis on le voit très clairement ici on a des self, on a des attributs, doncquand vous avez des classes qui sont utilisées de façon à ranger certaines choses vousallez avoir des méthodes ici et en fait vous allez d'ailleurs avoir dans les éditeurscomme PyCharm des indications qui vont vous dire votre méthode est peut-être statique,
00:15:20 :méthode statique ça veut dire que c'est une méthode qui n'accède pas ou qui nemodifie pas les propriétés justement les attributs de votre instance. Donc si par exemple
00:15:31 :on avait une méthode affichée ici qui faisait juste un print, ce serait une méthode statique,ce serait une méthode qui fait juste un print, qui fait juste une opération maisqui ne va pas modifier les attributs de l'instance. J'entends du bruit, est-ce qu'il y a quelqu'un
00:15:43 :qui voulait... Tiens Arthur qui nous a rejoint, super Arthur je présentais ton projet, jedisais qu'on allait y revenir un petit peu après, là je prends les projets un peu plussimples pour commencer et après on revient sur le tien qui est très très complet, bravo.
00:15:58 :Donc je rebois un coup, alors au niveau de la classe comme je te dis c'est vraiment bienfait, moi j'ai rien vu qui me fait sursauter, alors ce que je fais très souvent sur PyCharmvous allez me voir le faire, c'est un petit raccourci clavier qui va permettre d'enlever
00:16:21 :un petit peu tous ces warnings, donc c'est un raccourci qui est je crois que c'est dansle code, c'est celui-là, reformat, parce que là il y a plein de choses qui me sontsignalées parce que normalement selon les conventions vous devez mettre une seule ligneentre les méthodes, les fonctions, donc voilà ça permet de reformater tout ça pour enlever
00:16:41 :la plupart des avertissements. Ici il y a des avertissements qui restent, en fait çac'est probablement sourcerie, si je ne me trompe pas, si je laisse un peu swap, ouiça me semble être sourcerie, est-ce que c'est lui? oui c'est ça, donc en fait
00:16:57 :sourcerie c'est une extension qui vous suggère certaines choses, là par exemple il doitme suggérer si j'imagine bien de mettre tout ça à l'intérieur de l'ivestring,donc là si je fais hop, effectivement c'est ça, là vous voyez plutôt que d'utiliserun plus, il me conseille de mettre des crochets comme ça et d'ajouter directement l'élément
00:17:16 :à l'intérieur de l'ivestring. Effectivement les plus, moi je les utilise très rarement,je sais qu'il y a beaucoup de gens qui aiment bien mettre des plus ou des virgules aussi,parce que vous pouvez printer plusieurs éléments à la suite, moi je préfère tout le tempsfaire des ivestrings parce que ça ne fait pas de coupure, comme ça on voit vraiment
00:17:32 :tout qui est dans la même chaîne de caractère, alors que quand on met une virgule par exempleici, je vais désactiver aussi GitHub Copilot sinon il va m'embêter tout le temps, làpar exemple si je mets autre chose, je crois qu'il va mettre un espace par défaut entreles deux, mais du coup on ne sait jamais si vous en mettez un vous allez en avoir deux,
00:17:54 :donc je préfère mettre tout dans une seule ivestring et comme ça je suis absolumentsûr que là si je veux mettre un espace, je mets un espace et voilà il n'y a pasde sourcerie, donc là je pense que, j'essaie des fois de deviner ce que me suggère sourcerie,
00:18:11 :je pense qu'il va me proposer d'enlever l'EUL, c'est de faire une guard clause,c'est à dire de faire un, pas vraiment l'EUL, c'est un return, en fait c'estque vous pouvez garder un niveau, vous pouvez faire le NOT au départ, ce qui fait quedu coup on va prendre cette première condition ici et on va faire comme ça, donc on prend
00:18:30 :la condition if not et on return, alors là il est toujours pas content, alors ça c'estparce qu'il me dit comme ça je pense, je préfère ça, voilà, et là le print c'estpareil c'est l'ivestring, comme ça, donc là en fait vous voyez on a inversé la condition,je suis allé un peu vite mais ça permet en fait d'éviter d'avoir la logique principale
00:18:52 :on va dire de votre méthode à un niveau d'indentation, si je reviens à ce qu'onavait avant, là on a juste deux lignes de code donc c'est pas très très grave, maisen fait quand on a quelque chose comme ça, on pourrait imaginer que là il y a beaucoup
00:19:08 :de choses qui se passent, donc là on pourrait avoir plein de lignes de code comme ça, etlà vous voyez ça veut dire qu'on a trois niveaux d'indentation à chaque fois, doncc'est pas très très grave mais c'est pas, là trois ça va encore mais imaginezqu'on aurait d'autres conditions ici, ça peut vite faire un code en escalier, ce qui
00:19:26 :n'est pas très pratique, alors que quand on inverse, on va dire qu'on gère déjàle cas de figure où l'élément n'est pas dans la liste, donc on dit si l'élémentnote une liste, on retourne le print élément n'est pas présent dans la liste, et sinonon fait ça, donc là en fait le return va arrêter la fonction, donc si on a cet élément
00:19:46 :qui n'est pas dans la liste, on fait ça et on va pas continuer à la suite, si l'élémentest dans la liste, on va pas passer dans le if et du coup on va juste faire les deuxlignes ou les dix lignes qui suivent. Donc voilà, ça c'est ce qu'on appelle un guard
00:20:02 :close, c'est à dire que c'est ça, on va gérer les cas de figure en fait déjà,les cas de figure comme ça, on va dire si t'as ce cas de figure là tu le gères, sit'as ce cas de figure là tu le gères, et après on continue avec la logique principale
00:20:14 :de la fonction qui dans ce cas-ci est bien de supprimer l'élément de la liste. Donclà c'est bon, là pareil vous voyez on pourrait dire if not, donc si ça n'existe pas, ondit, alors là est-ce qu'on a besoin de dire quelque chose, ouais là y'a rien qui est
00:20:33 :fait dans le cas sauvegardé, donc là on pourrait dire par exemple, on pourrait direcomme ça, le fichier n'existe pas, et faire un return, d'ailleurs je conseille pas defaire un return du print directement, si vous faites juste un print, je ferais le printcomme ça et ensuite je retournerais quelque chose, soit false, soit true, soit none, mais
00:20:57 :je le mettrais sur autre chose, si vous voulez retourner par exemple le chemin, enfin onpeut retourner un peu ce qu'on veut, donc moi je le ferais plutôt comme ça, et aprèscontinuer comme ceci. Donc là un peu le même principe, sinon pour le reste c'est bien là
00:21:17 :encore j'aurais tendance à inverser, là vous voyez le son inpy ici, donc soit on faitif, bon après ça c'est vraiment du détail, on est vraiment dans la suroptimisation decode, c'est pas très grave d'avoir du code comme ça, ça marche très bien aussi. Et
00:21:38 :là il y a peut-être quelque chose qui est plus de l'ordre de comment on fait le script,là vous voyez que dans le init directement, on décide si le fichier existe de récupérer,et s'il n'existe pas on va l'ouvrir et on va mettre dans ce cas-ci une liste vide,
00:22:02 :parce qu'on déclare self.list ici à une liste vide, et on va créer le fichier. Leproblème de ça c'est que je suis pas très fan de classes comme ça qui font trop dechoses dans le init, le init ça devrait vraiment créer votre objet, mais si on commence à
00:22:17 :avoir un init qui crée l'objet, qui crée un fichier, qui potentiellement crée d'autreschoses, ça veut dire que vous pouvez pas vraiment, enfin ça va créer beaucoup dechoses à chaque fois que vous allez créer une instance avec votre liste. Donc si moi
00:22:30 :je veux juste tester la liste pour la tester en mémoire sans forcément écrire des fichierssur le disque, là actuellement j'ai pas trop le choix de le faire. Alors ce qu'on
00:22:38 :pourrait faire c'est dire ici, on pourrait rajouter un paramètre dans le init, par exemplecreateDefaultListOnDisk, un truc comme ça, c'est peut-être un peu long, createOnDiskpar défaut qui serait à false, et là on pourrait dire si if createOnDisk, et bienon le crée. Ça permettrait au moins d'avoir, et là effectivement on peut faire un elif,
00:23:02 :donc on pourrait faire ça comme ça, donc ça permettrait d'avoir quand même un mécanismede si on le souhaite pouvoir le créer et par défaut on ne crée rien, on crée justel'instance en mémoire et y'a rien qui est écrit sur le disque, le mieux ce seraitmême je dirais de faire ça dans une méthode et de pas avoir trop trop de logique directement
00:23:22 :dans le init, donc juste de dire elif createOnDisk, on ferait un self.createOnDisk comme ceciavec une méthode qui ferait cette opération, et qu'on pourrait d'ailleurs réutiliserpour la sauvegarde comme ça on aurait une seule méthode, là d'ailleurs on pourraitfaire le sauvegarder, je pense que ça marcherait, ça marcherait oui parce qu'il va faire le
00:23:41 :self.list. Donc voilà un peu pour le côté là dans ce cas-ci plus logique et init, depas trop en mettre dans le init. Rappelez-vous toujours c'est le single responsibility, il
00:23:56 :faut toujours se dire est-ce que peu importe l'objet que vous avez, que ce soit une fonction,que ce soit une classe, que ce soit un module, est-ce que je fais pas trop de choses au mêmeendroit. Si vous avez une fonction qui s'appelle sauvegarder list ou save list en anglais,
00:24:13 :on va le faire en anglais, si vous avez une fonction save list qui crée le fichier surdisc,qui crée la liste, qui potentiellement ajoute quelque chose au passage dans la liste, créele dossier et à la fin sauvegarde la liste, finalement c'est pas juste la sauvegarde,c'est 4 ou 5 opérations dans une seule fonction. Donc pareil si vous avez une classe list
00:24:34 :et que la classe list elle crée la liste, elle l'affiche, elle la sauvegarde, ellefait 15 trucs différents, des fois ça peut être bien d'avoir tout au même endroit,des fois on va commencer à se dire est-ce que la partie de la sauvegarde par exemplec'est pas ailleurs, est-ce qu'on va pas faire une classe sauvegarde à laquelle on
00:24:51 :va pouvoir passer différents types de listes, des listes en mémoire, des listes non desbases de données etc. et après notre classe sauvegarde va s'occuper de sauvegarder ces
00:25:00 :données de la bonne façon. Donc il faut toujours essayer de séparer un petit peu les choses.Ça va, pas de questions, c'est bon. Je vais profiter pour boire un coup. Donc aussi niveau
00:25:16 :nomenclature, n'hésitez pas à me couper si vous avez des questions. Jonathan qui esten train de taper. C'est bon, ouais pas de soucis Jonathan, je te dis c'est vraiment
00:25:26 :déjà très bien, t'as bien compris la logique des classes, juste la logique en généralmême de l'orienter objet, au niveau syntaxe etc. parce que je sais que le self par exemple
00:25:37 :ça pose pas mal de problèmes à beaucoup de gens donc c'est quand même très trèsbien exécuté. Au niveau nomenclature, là il y a plusieurs choses par contre que je
00:25:48 :reprendrais, c'est pas assez explicite en fait ma classe, bon après je me dis que tul'as probablement nommé comme ça au début et t'as peut-être pas pris le temps de faireun refactoring, les noms c'est toujours très compliqué à trouver, surtout que là onserait tenté de l'appeler quelque chose comme liste mais c'est risqué parce que liste
00:26:06 :c'est déjà le nom d'un objet en Python donc le constructeur qui permet de faire deslistes. Donc là effectivement c'est pas forcément évident comment l'appeler, en
00:26:16 :fait j'aurais tendance à dire qu'il n'y a pas forcément intérêt dans ce cas-cià faire un module séparé qui contient une seule classe, là t'as les données doncça c'est pas mal, c'est l'idée d'avoir en gros un peu des constantes donc des chosesqui ne vont pas bouger, d'ailleurs tu pourrais les mettre en chaîne de caractère en majuscule,
00:26:41 :alors je sais pas ce que c'est, je sais pas s'il bouge, mais en gros donc des constantesc'est des variables qui n'ont pas vocation à être modifiées, d'ailleurs là tu pourraismême mettre un tuple justement pour l'indiquer encore plus, parce qu'en mettant une, onme pose souvent la question pourquoi on utilise les tuples etc, bah juste par indication,
00:27:01 :en fait si vous mettez une liste, moi je vois ça je me dis potentiellement, avec le doubleeffet en fait, si je vois une variable comme ça en minuscule avec des crochets donc uneliste, moi là j'ai deux indications que potentiellement cette liste elle va changer,et il y a juste le fait que tu l'as mis dans un fichier données où je me dis bon ok c'est
00:27:20 :des données qui semblent un peu figées, mais si je vois ça en général dans un scriptje me dis bon bah ça c'est une variable qui a vocation à être modifiée, potentiellement.
00:27:28 :Effectivement Lytari, oui Lytari, David, j'ai ton pseudo en tête plus que ton prénom.Donc bon déjà mettre l'indication de mettre ça en majuscule ça indique effectivementqu'on est avec une constante, mais encore plus si vous mettez un tuple, là c'est mêmepas une question de, enfin c'est que si on veut le modifier il faut le convertir en
00:27:54 :liste pour ajouter quelque chose, donc ça veut vraiment dire que là on sait clairementqu'on est en train de faire quelque chose qui n'est pas totalement censé être fait.
00:28:02 :Donc voilà, là je trouve que c'est plus clair, et donc là données tu vois moi cegenre de fichiers je les appelle souvent constant justement, alors là c'est préférence personnelle,je sais que ça varie beaucoup, il y a des gens qui vont mettre data, constant, c'estun peu, ça change selon les développeurs, les conventions.
00:28:20 :Donc ça l'idée de tout séparer dans un fichier global, ça je trouve ça assez bien,ça permet de tout avoir dans un fichier, c'est pareil, ça me plaît bien.
00:28:32 :Le principal, là j'ai vu que t'as mis un tiret du bas devant, donc ça c'est plus quelquechose qu'on voit justement dans les classes, si tu veux faire une méthode qui n'a pasvocation à être utilisée directement, là effectivement tu vas mettre un tiret du basdevant et ça va faire, ah ok pour qu'ils soient en premier d'accord, bon ok, ouais
00:28:51 :alors ça je te déconseille, je le fais moi-même, c'est effectivement une technique qu'on faitassez souvent et je le fais sur plein de choses, sur les tutos par exemple, voilà, vous voyezparce qu'en fait quand j'ai des choses common, vous voyez, done, mesh filter, live hebdomadaire,des trucs assez classiques, on met un tiret du bas, voilà, et ça permet de les mettre
00:29:19 :tout en haut, mais c'est une petite astuce qui est assez souvent utilisée, après làdans ce cas-ci je te conseille vraiment de garder le nom du fichier comme ça, surtoutun tiret du bas, ça indique clairement l'idée que c'est quelque chose qui est privé, quin'a pas vocation à être utilisé directement, donc là ça peut donner des mauvaises indications.
00:29:42 :Ça aussi, faire très attention, alors là, ça va encore je dirais, d'ailleurs là j'aicassé tout le truc parce que j'ai changé du coup, là vous voyez c'est un truc, làj'en profite pour vous le montrer, là dans les constantes, la beauté de PyCharm, jepense que VS Code aussi doit avoir maintenant des mécanismes comme ça, moi ce que j'adore
00:30:13 :avec PyCharm c'est que si vous faites un clic droit, refactor, rename, il comprendvraiment votre projet en fait, il comprend que ça si je fais commande B, il va me trouvertous les endroits où c'est utilisé.
00:30:23 :Donc pour lui ici c'est pas juste une suite de lettres, c'est vraiment un objet qui estutilisé à d'autres endroits, il est capable de reconnaître que là c'est bien cet objetqui est utilisé ici.
00:30:33 :Donc le gros avantage c'est que si je fais un refactor, liste choix et que je le metsdonc en matchuscule, bah là si je retourne dans mon fichier principal, vous voyez çal'a bien modifié ici.
00:30:44 :Donc c'est toujours préférable de le faire comme ça, l'appareil, bon là je sais pass'il est utilisé à d'autres endroits, mais à chaque fois en fait il va chercherpartout pour s'assurer l'appareil, si je refactor et que je l'appelle constants commececi, vous voyez que d'ailleurs il l'avait fait, il a bien renommé constants ici à
00:30:59 :la place de done.Et je vais continuer du coup avec lui, choix et menu.Donc c'est toujours mieux de le faire comme ça, pour que tout soit renommé automatiquementet là on a plus d'erreurs.
00:31:14 :Donc, alors ça effectivement c'est une syntaxe qu'on déconseille très très souvent, dansce cas-ci ça me dérange moins parce que c'est un fichier que t'as créé, donc t'esun peu plus en contrôle de ce que tu fais, ce qui serait vraiment déconseillé c'estpar exemple si on importe depuis le module mat tout, il y a beaucoup de choses dans le
00:31:34 :module mat, si on va voir le module mat, vous voyez vous avez e, inf, nan, pi, to, vousavez plein de fonctions qui ont des noms qui sont assez courts et que vous pourriez potentiellementréutiliser par exemple log, log c'est un truc assez classique, donc le problème c'estque si vous faites ça en fait déjà vous allez importer beaucoup plus que ce que vous
00:31:54 :avez besoin, vous allez importer des dizaines de fonctions pour peut-être en utiliser finalementune seule ou juste une constante, donc ça va importer beaucoup de choses, ça va surchargervotre espace de nommage pour pas grand chose. Donc là comme je te dis t'as pas grand chose
00:32:09 :dedans, t'as trois variables, je comprends que c'est plus clair après dans le scriptde faire comme ça, après aussi tout simplement pour une raison de clarté, imagine t'importesconstants, alors soit t'importes en fait tu gardes ça comme ça et tu les importesune à une, après le problème c'est que là effectivement si tu commences à en avoir
00:32:25 :beaucoup c'est un peu pénible de devoir tout taper et à chaque fois que t'importes quelquechose de le rajouter et tu peux te retrouver avec une ligne qui fait 10 km, dans ce cas-cisoit t'as que trois éléments comme ça et je trouve que c'est plus explicite, voilàt'importes juste ce qu'il faut, parce que tu pourrais aussi penser que dans d'autres
00:32:43 :si ton programme évolue tu pourras avoir d'autres constantes ici et d'autres fichiersdans lesquels t'as pas besoin de forcément toutes les constantes, donc là au moins t'esvraiment explicite et sinon moi je trouve qu'il faut pas hésiter à faire un importcomme ça et ici à mettre constants.choix, c'est sûr c'est un peu plus long mais au
00:33:00 :moins quelqu'un qui lit votre script comprend tout de suite que là on est avec des constants,bon là après dans le cas des constantes c'est peut-être encore à pondérer parceque le nom de la variable est en majuscule donc là encore juste par la nomenclature,la casse plutôt dans ce cas-ci, on comprend que c'est des constants donc là ça fait
00:33:20 :un petit peu redondant mais pour d'autres cas de figure par exemple mat justement, ilfait from mat import ça et qu'après je fais log, si j'utilise log c'est pas forcémentévident que c'est le logarithme que j'imagine du module mathématiques, je pense que çadoit être ça, logarithme c'est ça, moi je vois ça dans un script, bon là on est
00:33:46 :en dessous de la ligne d'import donc c'est peut-être assez évident mais imagine vousavez plus loin dans votre script ça, moi là je me dis ok c'est une fonction de logincustom pour afficher des informations d'un loggeur alors que si vous faites justementsi vous protégez en gros avec l'espace de nom, là vous allez utiliser mat.log et là
00:34:05 :je comprends beaucoup plus facilement que c'est probablement plus le logarithme qu'unefonction de log donc c'est pour ça il y a une règle en python que vous pouvez retrouversi vous faites dans un interprète python import this, le z of python, vous avez explicitis better than implicit et vous avez tous les corollaires ici, simple is better than
00:34:26 :complex, complex is better than complicated, donc flat is better than nested donc ça c'estun peu ce qu'on avait vu avec les guard clause, il vaut mieux avoir des choses qui sont flatdonc qui ne sont pas à plusieurs niveaux d'indentation que des choses qui sont encapsuléessi vous voulez. Donc voilà readability counts, explicit is better than implicit, donc faut
00:34:47 :pas hésiter à avoir un petit peu plus à écrire et avoir des choses qui sont facilementcompréhensible même pour vous quand vous allez retourner dans vos scripts plusieursmois plus tard, ça fait un code qui se documente tout seul donc c'est beaucoup plus simple.
00:35:00 :Donc voilà sinon pour le reste ça me semble pas mal, là tu crées une liste, liste courante,input c'est bon, tant que le choix est différent de 6 on continue, on affiche le menu, doncça c'est bien, si le choix est 1 on demande ce qu'on veut ajouter, parfait, ouais alors
00:35:18 :ça tu vois je réfléchis, ça c'est peut être quelque chose, je réfléchis au niveaude la, ouais là effectivement je conseille effectivement parce que je sais qu'il y ades étudiants qui mettent pas mal d'input dans les méthodes et effectivement je déconseilleraisde faire ça parce que si ici vous faites comme ça en gros, élément ajout et que
00:35:45 :vous mettez input ici entrez un élément à ajouter, ça c'est quelque chose qu'onva revenir très souvent dans les gens qui débutent, il y a beaucoup d'input qui sontmis à l'intérieur même des méthodes. Le problème de faire ça c'est que vous forcez
00:35:59 :cette classe à être utilisée via une ligne de commande, via un terminal parce que làen fait je n'ai pas le choix de passer par le input pour dire à ma liste ce que je souhaiteajouter. Imaginez que votre script prenne de l'ampleur et que justement par la suite
00:36:13 :vous n'ayez plus un terminal mais vous ayez une interface graphique, bah là vous allezdevoir retourner ici pour dire bah maintenant en fait c'est plus input, ça va être quelquechose qu'on va lui passer via une interface graphique donc via un widget, enfin une lignede commande, une boîte de texte d'une interface graphique et là vous allez devoir donc remodifier
00:36:33 :finalement votre classe pour pouvoir l'utiliser dans une interface graphique et lui passerdirectement l'élément. Donc là effectivement c'est bien de le faire comme ça, de se dire
00:36:44 :que dans ce cas-ci on crée une application, donc ça c'est vraiment notre application,d'ailleurs principale je vais le renommer, je vais en profiter, on va le mettre en main,donc là voilà vous vous dites vraiment ça c'est mon application en ligne de commandequi utilise ma classe liste et qui dans ce cas-ci va demander des éléments grâce à
00:37:03 :la fonction input parce que on est dans un terminal et donc c'est la façon d'interagiravec l'utilisateur et on pourrait faire ici par exemple, bah à la place de main on pourraitl'appeler CLI par exemple, donc command line, ou oui, ou, ouais, si ça c'est CLI ouaisça pourrait être pas mal et on pourrait faire une autre, un autre fichier ici qui
00:37:24 :serait desktop app et là ici on aurait donc cette même classe qu'on utiliserait maisavec des interfaces graphiques et vous n'aurez pas besoin de changer la classe. Donc ça
00:37:38 :effectivement bien d'y avoir pensé et de l'avoir fait comme ça. Pareil pour l'élémentà retirer, afficher, donc là c'est juste du print, si ça, supprimer, sauvegarder,ouais ça c'est bon. Donc voilà pour les grandes lignes, comme je te dis tu vois il
00:37:53 :y avait pas grand chose à faire, c'est plus des indications générales, donc bravo pourtout ça, bravo aussi d'avoir quand même bien pu séparer les choses, comme je te disje pense que voilà au niveau des, essayez d'utiliser des mots en anglais le plus possible,je sais que moi dans les cours des fois j'utilise des mots français parce que c'est plus simple
00:38:12 :quand on parle de pas se couper tout le temps avec de l'anglais, mais dans vos scripts engénéral habituez-vous à mettre de l'anglais même si vous n'êtes pas à l'aise avecl'anglais parce que ça va vous, déjà vous faire apprendre du vocabulaire même si çava vous couper un petit peu dans votre flot d'écriture de code, mais c'est sûr à 99,9%
00:38:36 :que quand vous travaillez en entreprise vous écrirez du code en anglais. A différencierdes chaînes de caractère bien sûr là tu peux garder du français mais après pourtout ce qui est variable, nom de module etc. il vaut mieux garder de l'anglais. Donc voilà,
00:38:51 :est-ce qu'il y a des questions avant qu'on passe au prochain? Donc le prochain c'estle script de Lionel, New Window. Alors pas de questions, je regarde, c'est bon?
00:39:27 :Alors tout de suite c'est bon, j'en ai besoin, source, ça c'est quoi? Ah ça c'est celuide Arthur que j'ai lancé. Ok donc on va commencer avec lui. Alors là première chose, beaucoup
00:39:51 :de découpage. Là tu vois, ça peut être bien des fois de prévoir le terrain, de planifierun petit peu et de déjà commencer à penser en termes de module si vous savez que vousallez faire évoluer votre programme. Là si tu pars sur un programme dans le terminal
00:40:11 :en ligne de commande, ça fait beaucoup de découpage, on a juste trois fichiers, doncavec peut-être des fichiers, là je regarde terminal, donc là tu as un prompt, taskça doit être une classe et add user c'est une classe aussi. Donc tu vois, à la limite
00:40:29 :même task et add user, je me dis que ça pourrait se retrouver dans un seul fichieret on pourrait, et le terminal, là dans le main, tu as quoi? Ok donc tu as quand même
00:40:40 :pas mal de logique ici et dans le terminal, ok. Là j'ai du mal à comprendre, tu voisjustement quelle est la différence entre le main et le terminal. Terminal to the application
00:40:59 :et dans le terminal, alors là vous voyez ce qu'on peut faire quand on n'est pas sûr,clic droit, go to declaration or usage, donc commande B, un des raccourcis que j'utilisele plus sur PyCharm, parce que là je me dis, moi je vois ça, je me dis bon peut-être
00:41:15 :que ça c'est un fichier finalement qui est plus utilisé. Si vous faites commande B,en fait il va vous montrer tous les endroits où c'est utilisé. Donc si vous avez quelque
00:41:22 :chose qui n'est utilisé nulle part, et bien il va juste rien faire, il va rien se passer,vous n'allez pas avoir de pop-up et donc ça vous indique que la classe est utiliséenulle part. Là je fais commande B et je vois que c'est importé et utilisé ici dans le
00:41:34 :main, donc ça veut dire qu'il y a bien une utilisation qui est faite. Donc là si jecomprends bien, tu as ton script principal qui va utiliser cette classe et dans cetteclasse tu affiches les utilisateurs, les tâches et comment fonctionne le menu. Et
00:41:52 :dans le main, donc en fait là on a de la logique qui est un petit peu éparpillée.Là il y a beaucoup de choses que j'aurais tendance à fusionner. Peut-être aussi au
00:42:13 :niveau des noms, si vous avez vu ma correction du projet de Loic que j'avais fait sur Youtube,je crois que la correction dure 3 heures et il y a bien une heure, une heure et demieoù c'est juste de la réorganisation de nom de variable, de nom de module etc. où
00:42:30 :je simplifie justement parce que en découpant trop, souvent ça fait un peu l'effet inversejustement, c'est que en découpant trop, eh bien quelqu'un qui arrive dans votre scriptil va passer du temps à essayer de comprendre comment ça marche. C'est moins grave si
00:42:47 :c'est bien nommé, là il y a quand même une nomenclature qui est quand même bienfaite parce que task je comprends que c'est pour gérer les tâches. Add user, là tu
00:42:55 :vois je commence à être moins sûr parce que add user dans ma tête c'est une action,c'est tu vas ajouter des utilisateurs, sauf que là tu vois tu as une classe users quidoit représenter une liste d'utilisateurs qui permet d'ajouter, de récupérer la liste,de dessiner des tâches, donc en fait tu vois justement là tu fais beaucoup de choses
00:43:16 :dans une seule classe. Moi j'aurais peut-être tendance à faire une classe user tout simplementqui représente un utilisateur qui peut avoir ses tâches et après de faire une classeou même pas forcément peut-être juste une fonction qui va te récupérer tous les utilisateursde ton application. Donc tu vois là on commence à rentrer dans la subtilité du nommage,
00:43:36 :add user c'est très spécifique pour quelque chose qui fait quand même beaucoup plus quejuste ajouter les utilisateurs. Pascal Keyes pour le nom des classes. Oui Arnold me semble
00:43:49 :que c'est, ah oui effectivement Pascal Keyes, là effectivement il y a un tiret, je vaisrefaire un rename, refactor, d'ailleurs c'est marrant tu me fais rappeler que c'est, parceque il y a quelqu'un qui me posait la question récemment pourquoi on n'avait pas de CamelKeyes comme ça en Python et le Camel Keyes me semble être aussi une variante du Pascal
00:44:16 :Keyes, parce que le Camel Keyes il y a des gens qui vont dire que c'est que ça, si vousregardez par exemple sur Wikipédia ils vous disent que ça peut être ça ou justementCamel Keyes mais tu viens de me rappeler effectivement que le Pascal Keyes, là il n'y a pas d'ambiguïté,
00:44:28 :c'est bien avec les majuscules sur chaque mot. Ouais Arthur justement c'est ça, c'estce que j'étais en train d'expliquer, je vais vous montrer Camel Keyes, vous voyez le CamelKeyes sur Wikipédia, il vous dit, il y a le Camel Keyes comme ça illustré avec unchameau, là justement on a les deux C majuscules, il y a le Camel Keyes avec le dromadaire,
00:44:51 :là finalement c'est le vrai il me semble Camel Keyes, et le Snake Keyes qui est celuicomme ça pour le nom des variables, et le Pascal Keyes lui me semble, effectivementon n'a pas d'ambiguïté, parce que c'est ça, le Pascal Keyes c'est vraiment la premièrelettre de chaque mot qui est en majuscule, vous voyez il y a une petite visualisation.
00:45:18 :Camel Keyes me semble c'est quand même plus communément admis que c'est la premièrelettre en minuscule et toutes les autres suivantes en majuscule, Snake Keyes c'est tout en minusculeavec des tirées et Pascal Keyes avec Pascal Keyes, si c'est bien Pascal qui a donnéce nom, c'est comme ça. Et là on en a pas mal d'autres, Skewer Keyes, vous savez
00:45:37 :je ne savais même pas que ça s'appelait comme ça, Skewer Keyes, No Keyes, ScreamingSnake Keyes, j'aime bien aussi celle là, elle est pas mal, donc voilà Patrick Keyes,je préfère effectivement, bien vu Romain, toi tu as vu trop de vidéos Youtube, NicolasSkewing, c'est la blague ultime, donc voilà pour les conventions, après il y a une petite
00:46:16 :tirée qui s'est introduite ici mais sur le reste c'est bon pour ça, tout le resteest bien, donc tu vois vraiment, vraiment regarder je pense que ça peut être trèsintéressant pour le coup, même si c'est peut être un peu dur à suivre parce quejustement je passe beaucoup de temps à bouger des trucs dans tous les sens et je sais pas
00:46:32 :à quel point c'est digeste quand on regarde ça et qu'on est pas à l'intérieur demon cerveau, mais là je sais pas si David, si t'as l'occasion d'aller chercher lelien, c'est la correction du projet étudiant, c'est l'avant-avant dernière vidéo jepense sur Youtube, ça permet vraiment je trouve de montrer que par exemple un moment,
00:46:53 :juste par exemple sur les pluriels, quand vous mettez quelque chose au pluriel, làvous voyez, bon là t'as mis un pluriel, users avec un S, et c'est bien le cas parcequ'effectivement, et on le voit très rapidement que c'est pour gérer une liste d'utilisateurs,donc là c'est logique d'avoir un S. Mais ça m'arrive souvent de voir des gens qui
00:47:12 :vont faire par exemple task avec un S et qui vont récupérer une tâche unique ou alorsl'inverse, task sans S et qui vont récupérer une liste de tâches. Et donc moi je vois
00:47:22 :ça, bon là si je mets une liste on comprend tout de suite que c'est une liste et on peutà la limite comprendre, mais si vous voyez quelque chose comme ça, ou là encore, onpourrait avoir le double de la confusion, une variable au singulier et ensuite une fonction
00:47:37 :get task avec un S. Donc là on se dirait ok, qui a raison, qui a tort? Est-ce queça va vraiment récupérer plusieurs tâches ou est-ce que, et à l'inverse on pourraitavoir des choses comme ça, donc faut vraiment faire attention à ça parce que là encoreça peut causer beaucoup de confusion pour les gens qui lisent votre code. Donc là tu
00:47:53 :vois Lionel, là moi je séparerais ça parce que là il se passe trop de choses, mêmelà tu vois gros gros indications, 7, alors aussi au niveau 7 assign, alors là c'estpeut-être aussi du côté anglais, c'est sûr que quand on commence à, moi-même quandje fais des choses en anglais je suis jamais sûr, est-ce qu'on met retrieve, est-ce qu'on
00:48:13 :met get, est-ce qu'on met element, est-ce qu'on met item, il y a 10 000 synonymes pourles mêmes choses. Là 7 assign pour moi ça fait un petit peu doublon, c'est déjà un
00:48:24 :peu une notion d'assignement, donc là j'imagine que tu as mis 7 en relation avec le get, parcequ'on fait souvent des get set, mais dans ce cas-ci je ferais juste un set task, àla limite set task to user ou alors assign task tout simplement à voir. Alors après
00:48:44 :là, qu'est-ce que tu fais, task list, n'hésitez pas aussi à mettre des doctrines, généralementsi vous faites des noms assez explicites, si vous mettez des type hints, si là parexemple vous mettez que c'est une liste, si vous mettez que ça va retourner à unuser ou je ne sais quoi, si vous faites tout ça, on peut comprendre déjà pas mal ce
00:49:08 :qui se passe sans forcément avoir besoin de trop expliquer. Là tu vois 7 assign task,je ne comprends pas trop en fait, j'imagine que ça assigne la tâche, mais après j'aiune task list. Donc j'imagine que ça assigne plusieurs tâches, là on revient sur les
00:49:23 :singuliers pluriels, si t'assignes une liste de tâches, soit je mettrais task au pluriel,tu vois, là c'est marrant, mais c'est vraiment le plus de temps que je passe souvent surles codes étudiants, c'est de penser à ça. Ça peut paraître complètement futile,
00:49:41 :on se dit bah il devrait passer plus de temps sur le code en tant que tel, mais vraimentmême pour vous, pour vos collègues futurs, mais même pour vous, quand vous allez revenirdans vos scripts dans deux mois, ce qui était évident pour vous au moment où vous l'avez
00:49:54 :fait et sans trop réfléchir justement à comment vous avez aimé les choses, ça vavous aider par la suite quand vous revenez dans vos scripts. Donc assigne une tâche
00:50:06 :à un utilisateur. Donc là tu vois, et justement c'est pour ça, à un utilisateur, mais làtu vois tu passes pas à l'utilisateur, donc là je commence à me demander comment fonctionnele programme, et c'est pour ça que je te dis qu'il se passe beaucoup de choses, làon a aussi les fameux codes en escalier, on va voir comment on peut simplifier tout
00:50:27 :ça, il y a un très bon exemple, on va essayer de simplifier cette classe, et je regardele temps fil, je pense que Arthur, désolé, j'ai l'impression que je te remets toujoursà la fin, parce que tu fais des projets assez avancés, mais d'ailleurs je vais fairevos corrections individuelles pour vous les donner aussi par la suite, donc si j'ai pas
00:50:51 :le temps de tout finir, pour Lionel je te ferai aussi un petit retour personnalisé,là j'avoue que j'ai beaucoup de trucs en ce moment, donc j'ai pas encore eu le tempsde le faire, mais j'essaierai de vous faire des retours aussi individualisés, parce queouais Arthur tu nous as fait un truc super complexe, enfin complet, parce que complexe
00:51:11 :c'est un petit peu connoté et péjoratif, j'ai pas encore tout vu, mais ça me semblaitassez clean et ça fonctionne, donc je sais même pas si j'ai énormément de choses àdire, mais probablement on trouvera des choses à dire Arthur, donc ouais, là je vais revenirsur la classe, je pense que ça c'est un exemple, alors surtout un premier projet de
00:51:37 :Django, ok, ouais ok, bah super, je me sens, non ok, celui d'avant, ok, je confonds lejeu de rôle, tu m'avais fait un truc très complet, mais en version terminale, donc ok,super, premier projet de Django, parfait, donc il y aura probablement des petits trucsà dire, mais en tout cas c'est déjà très clean, et très bien aussi de te passer sur,
00:52:00 :je suis content, je me dis que tu as peut-être écouté et appliqué mes conseils de ne pasavoir cherché à faire un truc méga complexe au niveau frontend, ça franchement je trouveça très cool, parce que ça marche, j'ai pas vu de bug, il y a des fonctionnalitésqui manquent, mais je pense que c'est juste un manque de temps comme tu m'avais dit, mais
00:52:18 :sur tout ce que tu as eu le temps de faire, ça marche, c'est nickel, donc ça c'est vraimenttrès cool. Le projet visuellement est fonctionnel, après dans le code je regarderai s'il y a
00:52:26 :des choses à redire. Donc je reviens ici, alors là, comme je dis il y a plusieurs choses,je pense que je vais séparer, je vais faire une classe pour les utilisateurs, parce quelà vous voyez dans le init, on récupère, on a déjà un peu cette notion qu'on a un
00:52:45 :seul utilisateur, et après effectivement tu gardes la liste des utilisateurs ici, doncde ce que je comprends, moi je vais enlever le S ici, on va considérer que cette classelà ça représente juste un utilisateur, et on va, je sais même pas si je vais faireune classe pour gérer les utilisateurs, parce que ça me semble être peut-être un peu
00:53:05 :overkill, comme on dit, il faut que je trouve la traduction de ce mot en français sur overkill,qu'est-ce qu'il nous propose, je suis pas en portugais, overkill pertinent, c'est çaqu'il nous propose, exagérer, ouais, je sais pas si c'est une meilleure traduction, c'estutiliser un gros mécanisme pour peut-être un truc qui au final est assez simple, si
00:53:33 :l'idée c'est juste de récupérer la liste d'utilisateurs, tu vois, on fait une fonctionqui va créer des instances à partir d'un fichier, si tu les sauvegardes sur le disque,ou alors tout simplement une liste qui va garder tes utilisateurs en mémoire et çasuffit. Donc tu vois, là je vais considérer ça que c'est vraiment l'utilisateur, donc
00:53:52 :là on a name, last name, ça c'est parfait, ça je vais enlever du coup, et on va voircomment gérer ça par la suite, donc comment gérer la liste d'utilisateurs. Donc là,
00:54:06 :pareil, tu vois, là t'as une notion de projet, donc là tu vois, pareil, que ce soit avecun seul ou plusieurs utilisateurs, là tu as une task list, t'as des projets, donc làtu vois, il y a trop de trucs qui sont mélangés dans le même endroit. Donc là moi je vais
00:54:24 :considérer que c'est juste l'utilisateur qu'on veut afficher, donc je vais mettreici self.name et self.lastname, et tout de suite aussi ce que je vais faire, donc ce
00:54:37 :qu'on fait généralement, c'est que là je vais vouloir tester mon code, donc je vaisfaire un if, name le fameux d'ailleurs, si je fais juste main, ça doit me le faire,donc ça c'est en fait quelque chose qui n'est exécuté que si vous lancez directementce fichier, ça veut dire que quand on va importer la classe dans un autre fichier,
00:54:55 :donc par exemple, je sais pas où est-ce que tu l'utilises, user, je vais quand mêmele renommer, ouais ici voilà. Donc là quand on importe comme ça, tout ce qui se passe
00:55:11 :à l'intérieur de ça ne sera pas exécuté. Je vais pas vous faire un cours là-dessus,j'ai tout expliqué dans le glossaire sur docstring à ce sujet, donc si ça vous intéresse,vous pouvez aller lire là-dessus, name, voilà. Je vous le mets dans le chat. Voilà, ça
00:55:32 :vous explique justement en détail pourquoi et comment ça marche. Donc là ce que çame permet de faire c'est de tester, de dire on va essayer de créer un utilisateur, onva créer Patrick Watson justement, et si je fais un print de Patrick, donc là hopje lance juste ça, ah oui parce que là j'ai pas d'interpréteur Python, donc on va juste
00:55:53 :lancer comme ça, et on va lancer du coup dans listusers, addusers, le module maintask, ah oui parce que là du coup, je sais pas, du coup la task list, ouais est-ce quet'en as besoin, alors il faut que je me déplace, merde, hop c'est des listusers, et addusers,
00:56:21 :ah oui parce que là, ah, ça c'est le, non ça j'en ai pas besoin, ah il m'embête,je peux pas d'interpréteur. Donc oui parce que là en fait, et c'est pour ça que je
00:56:34 :te dis qu'il faut simplifier selon moi tout ça, c'est que là en fait il faut lancerton projet depuis le bon dossier pour que la suite se fasse bien, et là si je veuxappeler ton module directement, il faut le faire à partir du dossier principal pourque t'aies bien toute la chaîne qui se fasse, là tu dis from task, mais task tu vois il
00:56:54 :est, donc task en fait c'est ton module ici, t'as pas les limites non plus, donc en faitc'est pour ça que je te dis tu complexifies en fait ton projet, donc moi ce que j'aienvie de faire déjà c'est de tout sortir en fait comme ça, je vais supprimer ces dossiers,
00:57:12 :je vais faire un petit peu de refactoring, ça on va l'appeler, j'ai même envie detout mettre dans le même fichier, je vais peut-être finir par faire ça, je vais lemodifier, mais là tu vois j'ai vraiment envie de fusionner task et users, et même limiteje me pose la question, ça c'est sûr que c'est toujours un petit peu, c'est toujours
00:57:36 :chiant de nommer les trucs, comment on pourrait l'appeler, parce que dans un script commecelui-ci, dans un script comme celui-ci, j'aurais limite envie de mettre au pire dans deux fichiers,si on a le, moi je verrais peut-être pas trop d'inconvénients, on aurait peut-être 200 lignes de code,je verrais pas trop d'inconvénients à mettre tout dans le même fichier, bon là je vais
00:58:01 :garder task et user, mais le truc après c'est que, c'est pas tant un risque, mais c'estque si vous avez un fichier task qui contient une seule classe qui est task, vous voyezça fait un peu, ça fait task task, après vous allez avoir user user, à terme en fait
00:58:20 :généralement moi j'ai plus trop ce problème parce que les projets que je fais sont assezconséquents, donc en fait on se retrouve à avoir, si j'ai un module users, il va pasy avoir juste une classe dedans, il va y avoir la classe users, user, il va y avoir des modules,
00:58:31 :enfin des fonctions, il va y avoir pas mal de choses qui font que là effectivement çafait du sens de tout rassembler dans un module.
00:58:37 :Quand vous avez des plus petits projets, moi je suis partisan de soit en fait tout mettredans un fichier et c'est pas grave, vous avez 200 lignes de code et ces 200 ou 300 lignesde code ça reste assez gérable dans un fichier, c'est pas vraiment trop et vous avez tout
00:58:54 :au même endroit et vous avez pas à vous embêter justement, et soit sinon vraimentvous partez dans quelque chose de plus complexe et là vous pouvez commencer à faire desmodules mais si vraiment vous avez plus qu'une classe dedans.
00:59:05 :Et après là ça va dépendre, peut-être que l'Itari, David, t'aurais d'autres façonsde faire et d'organiser, ça dépend des compagnies, des développeurs, on a tous unpetit peu nos façons de voir les choses aussi là dessus.
00:59:18 :Moi dans mon cas ça me dérange pas trop de voir 300 lignes de code, c'est même pas tant,à l'intérieur d'un fichier c'est même pas si grave en fait, je dirais c'est plus, sivous avez un fichier qui a 300 lignes de code mais dans ces 300 lignes de code vous avez
00:59:36 :deux fonctions de 150 lignes chacune, là c'est problématique parce que là en faitvous avez des fonctions qui font beaucoup trop de choses.Mais si vous avez 300 lignes de code mais qu'à l'intérieur il y a que des classeset des fonctions et des choses comme ça qui sont vraiment single responsibility, qui ne
00:59:52 :font qu'une chose, là ça me dérange pas tant.Donc là du coup lui je vais l'appeler user tout simplement et je vais lui configurer,je vais lui dire ok utilisez setup sinon il va m'embêter et là t'as pas de moduleà installer donc je peux utiliser le Python 3.9 par défaut.
01:00:13 :Donc là j'ai pas mal d'erreurs qui vont arriver, ça c'est pas grave.Et donc là il va bien vouloir me le lancer, qu'est ce qu'il veut dire, ah oui parce quej'ai dû renommer des trucs, ah oui c'est ça ce working directory qui marche plus,donc on va supprimer ça, on supprime tout, on relance.
01:00:36 :Donc là j'ai bien Patrick Watson qui s'affiche qui est donc le résultat du string de Python3.9 de mon instance ici, et on va continuer avec la suite, donc get user list, pareil
01:00:51 :on va enlever, on en a plus besoin, add new user, tu vois ça c'est quelque chose, qu'estce que tu fais ici, name last name, self.name, ok tu ajoutes dans la liste, donc ça aussi
01:01:05 :je vais le sortir pour l'instant, on va le mettre ici, je vais voir si on en a besoinpar la suite.Et là tu as ton set assigned task list, et ton task list je vais aller voir commentil est fait, donc là c'est une liste de tâches, add a task, donc là tu vois tu as fait un
01:01:28 :attribut de classe qui je pense serait plutôt un attribut d'instance, là tu as mis desattributs de classe, tu vois tout ça c'est probablement plutôt à mettre au niveau del'instance, ouais, oui oui, il n'y a pas trop d'hésitation là dessus, donc ça je vaisles déplacer ici, ça c'est quelque chose, on ne s'en rend pas trop compte, en fait je
01:01:51 :vais essayer de l'expliquer, c'est un petit peu compliqué à expliquer, ce que je veuxdire par là c'est qu'on ne s'en rend pas trop compte parce que, comment dire, les attributsde classe par défaut vont être disponibles sur l'instance, donc je vais refaire un, oùest-ce que je vais vous le faire, pareil on va faire un main, donc c'est que si je fais
01:02:18 :une instance comme ça, là je peux afficher un numtask, ou et là c'est une name, ok,donc là vous voyez si je lance ça, là je peux accéder à numtask parce que j'ai définiun attribut de classe et donc toutes les instances ont accès à ces attributs. Donc c'est pour
01:02:46 :ça que je dis qu'il y a beaucoup de gens qui mettent ça ici et qui se disent ah bahc'est bon en fait je peux continuer comme ça, il faut faire vraiment attention parceque là il y a beaucoup de choses qui peuvent se passer en fait, ce qu'il faut comprendre
01:02:58 :c'est que vous pouvez avoir deux attributs qui ont le même nom mais qui ne sont pasles mêmes. Je vais essayer d'expliquer pour ceux qui auraient du mal à comprendre, là
01:03:09 :je vais essayer d'expliquer en live, j'explique tout ça dans la formation sur l'orientéobjet de façon beaucoup plus posée parce que du coup j'ai pris des semaines à faireces vidéos, là je vais essayer de bien l'exposer clairement. Là par exemple j'ai tasklist
01:03:22 :qui est une liste vide, surtout avec un objet immuable qu'on peut modifier ça va êtreassez parrain. Donc là si je fais print task list ça va fonctionner, je vais lancer ça
01:03:35 :j'aurai bien une liste vide et si je fais, on va faire ici un projet, on va faire courseet là on va faire vidéo. Donc là j'affiche ça, j'affiche ça, là je vais avoir deux
01:03:50 :listes vides. Là imaginez que je fasse tasklist cette fois ci sur la classe et que tasklistje fasse un append de Patrick. Qu'est ce que vous pensez qu'il va se passer avec ça? Je
01:04:06 :vous laisse 10 secondes pour y réfléchir pendant que je bois de l'eau. Vous pouvezmettre vos suggestions dans le chat. Là qu'est ce que ça va afficher? Pas sûr? Ça bouge,
01:04:36 :c'est à dire ça bouge. Ah vous voyez rien. On voit un miroir en fait, désolé mais onvoit pas ton écran. Ah oui excuse, oui oui oui parce que je regardais le chat. Une liste
01:04:54 :avec Patrick. En fait là ce qu'il va se passer c'est que vous allez avoir la même, donclà le print il va rien faire parce que ça retourne rien, c'est qu'en fait il y a lamême liste ici. C'est à dire qu'on modifie la liste sur la classe et donc du coup ici
01:05:13 :c'est la même liste qui est modifiée. Mais là où en fait c'est perturbant c'est quesi je fais course.append et que je relance, et je vais afficher aussi le course tasklist
01:05:37 :que j'ai enlevé. Là vous voyez on va toujours modifier la liste, donc ça c'est le côtémutable, c'est que on est en train de modifier du coup sur un objet muable, on est en trainde modifier le tasklist principal. Et donc là en fait ça va tuer un peu cette idée
01:05:59 :d'instance parce que quand on a des instances on n'a pas envie que toutes les listes, lesinstances créées à partir de notre classe aient les mêmes tâches. Donc c'est pour
01:06:14 :ça qu'il faut déplacer ces attributs au niveau de l'instance, donc avec le self dansle init pour pouvoir avoir des instances qui vont avoir des listes séparées. Donc si
01:06:29 :je reviens là et que cette fois-ci je vais vous montrer si je le déplace, que je prendsle tasklist et que je le mets là, et que là j'en fais un attribut d'instance cettefois-ci. Je pourrais garder un attribut de classe d'ailleurs si je le souhaitais qui
01:06:40 :aurait le même nom, il en aurait deux attributs, quoi que je réfléchisse, en le disant j'aiun petit doute, mais non on pourrait toujours, en fait ça c'est ce qu'il faut faire attention,c'est qu'à un moment vous allez pouvoir aussi avoir les deux, c'est à dire que vousallez potentiellement, par exemple sur le numtask ici, si je fais print de course.numtask,
01:07:06 :alors je vais le modifier en fait, je vais faire course.numtask égale à 2, et ensuiteje vais afficher tasklist.numtask. Donc là vous voyez si je lance ça, on a deux choses
01:07:33 :différentes, c'est le même nom, mais là en fait on a modifié, on a dit numtask égaleà 2 sur notre instance, du coup là en fait on a créé un attribut d'instance, puisquelà on a bien le point, donc numtask appartient à notre instance course, et on dit qu'il
01:07:48 :est égal à 2. Du coup là on se retrouve avec deux attributs qui ont le même nom,qui n'ont pas les mêmes valeurs, donc on a bien l'attribut sur l'instance course quiest égal à 2, et le numtask lui il n'a pas bougé. Par contre si je le modifie au
01:08:02 :niveau de la classe, que là j'affiche, là on aura bien deux des deux côtés, parceque là on modifie l'attribut au niveau de la classe, l'attribut de classe, donc làquand on affiche numtask, il va regarder est-ce qu'il y a un attribut numtask qui existeau niveau de l'instance, ce n'est pas le cas, du coup il va remonter un niveau, il
01:08:23 :va aller voir au niveau de la classe est-ce qu'il y en a un qui existe, et là oui, etdonc il va nous afficher celui de la classe. Mais dès que je modifie, en fait dès que
01:08:30 :je dis numtask égal à quelque chose, ça va du coup créer un attribut au niveau del'instance, et du coup on aura deux attributs, un au niveau de l'instance et un au niveaude la classe qui ne seront plus pareils. Donc voilà, tout ça, là ça devient un petit
01:08:44 :peu compliqué, comme je vous dis, reprendre ça à tête reposée c'est expliqué beaucoupplus précisément avec des exemples, etc, peut-être un peu plus parlant dans les vidéosdes cours sur l'orienté-objet. Mais du coup là, clairement, ça c'est au niveau
01:08:59 :de l'instance qu'il faut le mettre, et pour tout le reste pareil, donc numtask çapourrait être une propriété d'ailleurs, puisque numtask en fait on veut savoir combienil y a de tâches, donc ce qu'on pourrait faire c'est tout simplement faire un printde len de course.tasklist, donc là tout simplement on récupérait le nombre de tâches qu'il
01:09:20 :y a dans cette liste, mais c'est peut-être pas forcément, comment dire, c'est assezexplicite, bon len on le connait bien, mais si on voulait avoir un nom un peu plus explicite,là c'est quelque chose que je ferais avec une propriété dans mon cas, une propriétéça permet de créer si vous voulez un attribut dynamique dans ce cas-ci. Donc si je mets
01:09:42 :un décorateur addproperty et qu'on fait un number of tasks, et j'en profite pourdire là encore explicit better than implicit, numtask, numtask comme ça, numtask, c'estpas très clair, num, c'est quoi c'est numéro de la tâche? c'est number, vous
01:10:00 :voyez? number, numéro, est-ce que c'est numéro, number, on sait pas trop. Donc lànumber of tasks c'est clair, c'est précis, et là on pourrait faire un return de lende self.tasklist. Donc ça ce que ça nous permet de faire ici, je vais garder juste
01:10:15 :ça, c'est d'avoir quelque chose de plus explicite, number of tasks, donc comme jevous dis l'intérêt c'est que là en mettant le addproperty, si j'enlève le addpropertyça veut dire qu'il faut que je mette les parenthèses ici, parce que ça veut direque ça c'est une méthode, comme une fonction, il faut l'appeler pour récupérer ce qu'elle
01:10:33 :contient. Si on met addproperty ça le transforme en propriété, et donc dans ce cas-ci làvous voyez il me le souligne, int object is not callable, pourquoi il me dit ça? parce
01:10:41 :que là en fait si vous suivez bien len de self.tasklist ça va retourner un nombreentier, je vais le mettre d'ailleurs ici, ça va retourner un int. Donc là si je mets
01:10:52 :addproperty, ça veut dire que number of tasks, je peux y avoir accès juste comme ça, commeun attribut normal, comme une variable, et donc le problème c'est que si je mets desparenthèses là pour le coup, c'est comme si on appelait un nombre entier, parce quenumber of tasks ça va être quoi? ça va être par exemple il y a 5 tâches dans la
01:11:10 :liste, et on peut pas faire 5, on peut pas appeler le nombre 5, donc c'est pour çaque si je mets des parenthèses il me met tout petit en bas ici, int object is not callable,on peut pas appeler un nombre entier. Là si je fais ça par contre, course number of
01:11:26 :tasks, je relance et là j'aurai bien 0 dans ce cas-ci puisque je n'ai aucune tâche dansla liste. Donc là si on continue, add task, voilà, alors là tu vois on revient sur ce
01:11:36 :que je disais à Jonathan, oui non Lionel, non là je sais plus, là c'est le scriptde Lionel si je ne me trompe pas, et tout à l'heure c'était Jonathan, donc Jonathanqui avait bien sorti le input, et là tu vois on va se retrouver avec le problème que si
01:11:54 :finalement cette classe tu l'utilises dans une interface graphique, ça ne fonctionneplus. Donc là il faudrait plutôt dire name description, donc tout ce qu'on veut lui
01:12:04 :passer, et priority aussi, priority par défaut on peut le mettre à 1 par exemple, puisquetu n'as que 2 choix, 0 ou 1, parfait. Donc tu vois moi je ferais quelque chose comme
01:12:17 :ça, d'ailleurs là on pourrait même faire, je réfléchis, là tu vois je serais tentéde faire un attribut de classe, de dire high égale 1 et low égale 0. Et ça peut être
01:12:32 :une façon de faire qui te permettrait quand tu crées ta tâche, plutôt que de lui passerun nombre qui ne veut pas dire grand chose, 1 0, pour des priorités on peut comprendreque plus le nombre est élevé, plus la priorité est importante, quoique ça pourrait êtreà discuter, on pourrait penser que la priorité 1 est plus importante que la 5, oui en fait
01:12:57 :ce serait même plutôt logique. Donc tu vois là tu es obligé de préciser 0 c'est lowet 1 c'est high, donc là toi tu es dans le sens inverse. C'est le nombre de tasks ou
01:13:11 :le next ID, je n'avais pas vu ta question, je pense que c'était pour tout à l'heure,je l'ai 4 heures après c'est ça, je pense que tu parlais tout à l'heure quand on afait le number of tasks. Donc tu vois là on est effectivement obligé de lire dans
01:13:36 :le code pour comprendre quelle est la priorité ici. Donc là on pourrait dire par défaut,même ne pas en mettre par défaut, on va dire task.high. Alors là, task list, je pense
01:13:53 :qu'il n'avait pas voulu voir, non il ne veut pas ici, parce qu'il ne comprend pas, c'estpour ça, dans ce cas-ci on peut faire un enum, je réfléchis, self, ouais mais nonc'est ça qu'il ne veut pas non plus, je réfléchis, généralement je le fais avec des, je suis
01:14:14 :beaucoup dans Django ces temps-ci et quand on fait des choix comme ça dans une propriétéon fait une métaclasse et du coup ça pose pas de problème. J'aurais pensé qu'il le
01:14:38 :prendrait dans ce cas-ci, ça c'est un peu le même problème dans les annotations detype qui va être réglé dans le Python 3.11, c'est que si vous retournez quelque chose
01:14:49 :qui appartient à la classe, si on met task list ici, il ne va pas le comprendre. Petiteparenthèse. Donc là soit on pourrait le mettre tout simplement des constantes ici
01:15:00 :comme ça, soit on peut faire un enum, mais moi j'aurais préféré le mettre dans laclasse. Donc là je, je trouve ça bizarre, c'est parce qu'on le met dans la définition
01:15:11 :de la fonction, après ici on pourrait l'utiliser task list point n'importe quoi. Donc làon va rester comme ça, name description priority, je regarderai ça et puis je vous ferai unpetit retour, je vais essayer de noter quelque part, je vais essayer de pas oublier et puisje vous ferai un petit retour sur comment solutionner ça. Là j'avoue que pour l'instant
01:15:33 :je vois pas. Bonne soirée Julien, je sais pas David toi comment tu le ferais, là j'avoueque comme ça sur le moment j'aurais pensé qu'on pouvait lui passer directement l'attributde classe. Donc là vous voyez on va pouvoir pas mal simplifier tout ça ici. Donc le number
01:15:50 :of tasks on va pouvoir l'enlever du coup. Task list on peut le garder, add a task. Alorslà vous voyez quand vous avez des trucs comme ça, ça vous pouvez simplifier. Si on a une
01:16:02 :variable qui n'est utilisée qu'une seule fois, on peut directement, d'ailleurs je suissurpris que Sourcery ne le recommande pas, c'est peut-être ça qu'il me recommande quelqueslignes plus haut en fait. Ah non ça c'est pour le, ouais ok ça c'est autre chose. Là
01:16:16 :pareil statue tout doux, tu vois il est utilisé juste là, color aussi, donc là en fait hopon peut mettre ça ici, on peut prendre le yellow dans le color. Après ça c'est peut-être
01:16:29 :des choses que tu avais prévues d'implémenter par la suite, parce que là je vois que çachange pas donc toutes les tâches sont par défaut en tout doux j'imagine. Yellow, ouais
01:16:38 :en fait ça c'est peut-être juste des trucs par défaut. Pareil pour le timestamp, situ l'utilises juste ici, ouais ça c'est des valeurs par défaut. Sans le task list,
01:16:49 :bah non ça ça marchera pas parce que si je mets high, tu mets le doute, mais si non,ah tu vois j'ai parlé trop vite. Alors ça je trouve ça marrant, on découvre encore
01:17:07 :des trucs des années après. Donc il comprend, ah c'est marrant ça. Donc il a accès directementaux attributs d'instance à l'intérieur des méthodes. Ouais bah en fait je réfléchis
01:17:26 :mais ça doit être, en fait c'est le même principe, non c'est pas étonnant, c'estle même principe qu'une fonction et que ça par exemple ici, c'est à dire que sije fais une fonction test ici, bah là je peux afficher yellow. Donc on a accès dans
01:17:40 :l'espace local de la fonction à ce qui est déclaré dans l'espace global et donc làc'est un peu la même chose en fait, c'est qu'on a du coup l'espace de la classe quicontient high, qui contient project name et qui contient les noms de toutes les méthodes.
01:17:56 :Donc effectivement en fait c'est assez logique qu'on puisse l'utiliser directement ici.Vous voyez c'est quelque chose que j'avais jamais fait comme ça et comme je vous disen fait je suis mélangé, je vais vous montrer justement sur docstring par exemple cpf request,quoi que là, ouais en fait c'est ça, ah non là je vais vous montrer sur les invoice.
01:18:20 :Invoice vous voyez en fait on fait une classe à l'intérieur de la classe, donc là j'aiune classe à un modèle et on fait une classe pour statut, billing reason qui sont des trucsspécifiques à Django et après ça me permet ici vous voyez de faire voilà invoice.status.fail
01:18:38 :ou invoice.status.fail etc. Donc c'est pour ça que ouais, en ce moment là je suis beaucouphabitué à faire comme ça. Tu m'as mis un screen sur le chat, ah oui du coup dans le
01:18:55 :hop, ouais c'est ça, ouais effectivement c'est ça, ça marche du coup comme ça, cequi comme je dis n'est pas surprenant finalement, puisqu'on a accès aux variables qui sontdéclarées ici, donc c'est normal. C'est vrai que il y a aussi, ouais je réfléchis,
01:19:16 :parce que ici quand vous faites des classes méthode, là si je refais pareil un test,vous pouvez faire en fait une classe méthode et là ça va pas être self, ça va êtrecls et là en fait vous allez avoir accès à la classe et à tout ce que vous voulez
01:19:32 :sur la classe, donc c'est pour ça qu'il y a plein de petits mécanismes comme ça etj'avoue j'aurais pas pensé que ce soit aussi simple finalement, j'aurais cherchéun truc plus compliqué. Donc je reviens ici, donc là voilà, là il va me dire je pense
01:19:44 :que je pourrais tout faire sans cette variable, si je fais ça hop hop, ah non même pas qu'est-cequ'il me dit? Ah non c'est encore le where, ok c'est encore ça. Mais là vous voyez si
01:19:54 :on l'utilise nulle part ailleurs, le addTask dans ce cas-ci on peut le mettre directementici, ça commence à faire une ligne un peu longue mais c'est pas très grave, on pourraitd'ailleurs si on le souhaitait séparer sur les virgules, ça hop, pour avoir quelque chosedu genre et même le faire comme ça, hop, donc quel est l'intérêt de faire ça comme
01:20:20 :ça, ah oui quoique là le, ok là c'est encore le where, et le conseil aussi de rajouterune petite virgule à la fin qui n'est pas, qui ne cause pas de problème mais si vousn'avez rien appris en fait, l'idée c'est que quand vous faites ça comme ça, je vais
01:20:35 :lui régler ça parce qu'il va, ah merde, il m'a tourné dans l'autre sens, ok, c'estjuste que ça me perturbe ce petit warning. Donc là, oui l'idée c'est que si jamais
01:20:48 :vous avez besoin d'ajouter quelque chose d'autre, vous dupliquez la ligne, vous mettezautre chose là encore, et vous êtes sûr que vous avez toujours une virgule qui sépareles deux. Le problème c'est que souvent en fait si vous mettez pas la virgule à la
01:21:00 :fin vous allez dupliquer la ligne, vous allez mettre autre chose ici, et vous allez avoirune erreur parce que vous n'aurez pas la virgule qui sépare les deux. Donc le fait
01:21:07 :de mettre une virgule à la fin, ça permet de vous assurer que vous aurez toujours laséparation entre les éléments. D'ailleurs je réfléchis là, mais je me dis le time
01:21:14 :now, là pour le coup il faudrait peut-être le faire, alors c'est une question que jeme pose, parce que le UTC time now il va avoir tourné jusqu'à la milliseconde, si je neme trompe pas. Donc si je fais ça vous voyez vous avez 49 06323, donc c'est très précis,
01:21:33 :et là je me dis que c'est peut-être problématique parce qu'on ne crée pas une variable, onle fait deux fois, et je suis très tenté de faire l'expérience, à mon avis on n'aurapas, ça va différer d'un tout petit millionième de seconde ici, parce que du coup il va falloir
01:21:51 :qu'il appelle deux fois cette fonction. Donc là si on fait une liste comme ça, et qu'onmet, alors là on a tout cassé, je ne vais pas le copier, on va faire dateTime.UTCNow,
01:22:04 :dateTime.UTCNow, donc c'est peut-être quand même suffisamment rapide, et non c'est ça,vous voyez là on a 68 et là on a 72. Donc vous voyez même si c'est la millionième
01:22:16 :de seconde là, je ne sais pas à quel point ça a besoin d'être précis, là tu voisc'est, là il y aurait intérêt à faire une variable, donc à dire now égale dateTime.UTCNow,
01:22:34 :et là du coup si on fait ça, puisque du coup si on fait now égale dateTime.UTCNow,si on affiche now là il ne bouge plus, il a calculé une fois et il n'y a aucun risqueque ça bouge. Donc là tu vois, on aurait le now. Après pourquoi tu l'ajoutes deux
01:22:51 :fois, là j'avoue que je ne sais pas trop, et il faudrait voir ça. Là tu vois, pareilsetPriorityLevel, là tu as une fonction setPriorityLevel, ah oui d'accord, justement, donc ça confirmeun peu, là tu vois, priorityLevel, du coup je réfléchis, donc ça déjà on peut enlever,on peut enlever tout ça en fait, puisque ça ça va être frais, ça serait fait, donc
01:23:29 :il faudrait le mettre ailleurs bien sûr, et taskPriority, donc là tu vois en faitje ferais ça directement, si vraiment tu veux une chaîne de caractère équivalenteà high ou low, je ferais ça, je ferais directement low égale low, et comme ça, l'intérêtde ça c'est que tu auras de l'autocomplétion et c'est un peu documenté si tu veux, le
01:23:58 :problème c'est que si la priorité ici, donc là ça va être description, c'est que sila priorité ici c'est high ou low, ça veut dire que quelqu'un qui va utiliser ton programme,imagine il l'utilise ici, il va faire courts.addTask, ça veut dire je sais pas, banane, description
01:24:19 :c'était acheter des bananes, et priority, là tu vois, bah là je ne sais plus, tu vois,est-ce que c'est high ou non, c'était high ou un anglophone débutant il dirait highcomme ça, ou high, on sait pas, donc tu vois, là il faut retourner voir, tiens attendsqu'est-ce qu'il avait dit, high, low, qu'est-ce que c'était, qu'est-ce que c'était là ici,
01:24:42 :tu vois, ça c'est le problème, alors que si tu fais ça, là tu peux dire ok bah làen fait ça va être high, et là tu vois tu as l'autocomplétion, tu peux directementfaire, savoir si c'est high ou low avec l'autocomplétion, alors le low j'ai dû l'enlever, il est toujours
01:24:58 :là, tasklist.low, voilà, donc tu vois là t'as pas dans l'induité en fait.Ouais ça fait une heure et demie que, ah oui il est déjà, il est 10h, oh bah je vaispeut-être pas trop tarder parce qu'il y a encore des petits trucs à corriger sur lesusers aussi, là finalement on est retourné dans le task, vous voyez que là en fait pour
01:25:24 :fixer tout ça finalement, puisque là tu passes une tasklist, donc tu vois il y a deschoses à remonter d'un autre niveau, ça ressemble beaucoup, là je sens qu'on va surune correction très intéressante qui ressemble à celle que j'avais fait du coup sur leWIC, enfin je dis très intéressante, je dis pas ça pour moi, mais je parle au niveau
01:25:46 :de la façon dont sont construits les choses et justement le fait qu'il y a beaucoup dechoses qui se passent au même endroit et que c'est plusieurs problèmes en un en fait.
01:25:54 :Là vous voyez il y a tout ça qui se passe dans une fonction, donc là on a je sais pason a une cinquantaine de lignes, donc il y a beaucoup trop de choses qui se passentici et là tu vois tu assignes une tâche ou en fait une tasklist et là du coup tu
01:26:05 :vois t'es obligé de créer une instance, de faire des vérifications, là t'as dela logique d'utilisateur qui rentre à l'intérieur, donc tu vois il y a trop de choses qui sepassent et ça rend le code difficile à corriger, à comprendre, à débugger, alors que làtu vois on va se rendre sur quelque chose de très sain. On va voir add task, et bien
01:26:24 :add task ça va juste récupérer un nom, une description et hop ajouter cette tâchedans la liste. Donc il y a deux lignes de code qu'on pourrait même simplifier, enfin
01:26:33 :non parce que maintenant c'est normal, donc ouais il y a deux lignes de code, là onva mettre priority, si on veut faire un test unitaire pour la tester ça va être trèssimple et après à la fin ici tu vois dans cette sign task on aura probablement deux
01:26:47 :ou trois lignes de code gros maximum qui vont en fait faire appel à d'autres fonctions.Donc voilà, là tu vois add task ça me semble pas mal, priority level du coup on n'en aplus besoin, color state ouais alors là tu vois pareil ça va être à peu près le
01:27:04 :même délire, là comme vous avez plein de choses comme ça généralement il y a desmeilleures façons de faire. Après que vous ne les connaissiez pas encore c'est normal,
01:27:14 :je me rappelle avoir fait plein de code comme ça pendant longtemps au tout début, maisgénéralement dites vous que voilà quand vous avez beaucoup de if, quand vous allezêtre à un point où vous allez pouvoir commencer à revoir votre code, le refactorer, quandvous avez beaucoup de if-elif, de if-black alors black, if-orange alors orange, dites
01:27:34 :vous qu'il y a un moyen plus simple de faire et essayez de chercher du coup par la suite.Donc ça, et là tu vois du coup c'est ça, là tu vois on voit le problème du coup c'estque tu repasses du coup sur ton instance tu as une fonction qui va récupérer un attribut
01:27:53 :de classe, donc là clairement tu vois je pense que mon guess c'est que tu sais quetu s'était cet attribut à un moment sur ta tâche et après du coup tu allais le récupérersur l'instance alors qu'en fait tu peux le mettre directement, donc là c'étaitfinalement le numéro de la tâche et donc pas le nombre de tâches, donc effectivement
01:28:17 :on est peut-être plus dans ce que disait David tout à l'heure que numtask et ça revientdonc parfaitement sur ce que je disais que num c'est pas assez explicite. Tu vois moi
01:28:28 :j'ai pensé que c'était number, que c'était le nombre de tâches, justement pourquoij'ai pensé ça parce qu'il était au niveau de la classe, donc là je me suis dit ok auniveau de la classe il va stocker le nombre de tâches qu'il y a, donc moi c'est pourça que j'avais cette réflexion, donc tu vois là c'est moi qui basé sur la façon
01:28:45 :dont est construit ton code va faire des assumptions alors que si tu avais mis numberou number of tasks ou j'avoue qu'en anglais number c'est assez, ça peut vaut la direle nombre ou le numéro, le nombre de tâches versus le task number, le numéro de la tâche,parce qu'effectivement number veut dire les deux le nom ou le numéro, donc tu vois vraiment
01:29:30 :très très important comment vous appuyer les choses. Voilà donc je pense que je vaism'arrêter là, du coup ça fait une heure et demie qu'on papote, que je blablate onva dire, mais je vais prendre du temps de faire la correction, alors je la ferai peut-êtrelà, j'ai pas accès à mon, vous l'entendez peut-être, j'ai pas mon bon micro que j'ai
01:29:55 :habituellement, donc je reviens dans mon setup le 22, 23 juillet, donc ça risque d'êtreun petit peu décalé, je pense que la correction comme je disais au tout début, la correctiondes projets là c'est juste d'ici la fin de la semaine, j'ai pas encore de connexioninternet suffisante pour uploader les trois gigs de correction, mais d'ici la fin de la
01:30:16 :semaine, samedi dimanche je devrais pouvoir le faire, et les corrections précises jeles ferai probablement du coup à la fin du mois, pour vous les envoyer individuellementet puis faire un peu comme la dernière fois aussi, rassembler tout ça dans une vidéo,ouais c'est ça Jonathan, c'est qu'en fait, alors à moi, dites moi, j'avoue que j'ai
01:30:36 :pas, je vais arrêter le portage de l'écran, pour pas vous faire l'effet escalier, j'avoueque j'ai pas, j'ai pas, j'ai pas demandé, la dernière fois j'avais demandé, généralementles cheveux c'est assez catastrophique, j'ai les cheveux pas forts, il y a rien à faire,j'essaie de rattraper le coup mais non, voilà, donc du coup je vais couper la cam, ouais
01:31:04 :et les corrections en fait, la dernière fois je vous avais demandé si ça vous dérangeaitpas que je partage les corrections de tout le monde, donc j'avais demandé individuellement,là j'avoue que je pense qu'à terme je dirais que bon bah si vous remettez votre projet,vous acceptez qu'il y a une correction qui soit faite et qu'elle soit partagée avec
01:31:23 :les membres de la communauté parce que sinon ça va être un peu compliqué, de toute façoncomme à chaque fois faut pas avoir peur de montrer votre code, c'est quelque chose quevous allez faire tout le temps en entreprise, tous les jours il y a des gens qui vous allez
01:31:36 :faire des pull request, on va regarder votre code, on va commenter dessus et c'est la meilleurefaçon de progresser donc faut pas avoir peur de ça. Donc voilà, je ferai les corrections,
01:31:47 :là comme je l'avais pas annoncé, si vraiment il y a des gens qui veulent pas que je partagela correction des étudiants, mais à l'avenir je ferai ça et du coup oui je partagerailes corrections de tout le monde pour que vous puissiez avoir accès aux correctionsdes autres parce que je pense qu'il y a beaucoup à apprendre des projets de chacun. Voilà,
01:32:04 :est-ce qu'il y a des questions sur ce qu'on a vu, sur tout ça, sur n'importe quoi d'autre?Alors, donc Paul, si je me souviens bien, Paul, j'ai pas ton prénom là mais avec le nomde famille il me semble me souvenir que c'était Paul. Le cache-by-cache modifie mon URL de
01:32:33 :ma to-do list une fois hébergé. Tu veux dire donc t'as fait un projet Django c'est ça?L'URL, tu parles de vraiment l'URL, ouais, t'as fait un projet Django, tu l'as mis en ligneet le cache-by-cache modifie l'URL. Ok, alors ça semble très bizarre, on pourra, enfin je
01:33:03 :sais pas si t'as l'exemple là, si tu regardes cinq minutes, ça me semble très bizarre.C'est un, tu l'as hébergé sur quoi? Il enlève un P à tout dos. Le cache-by-cache,
01:33:18 :et qu'est-ce qui te fait dire que c'est le cache-by-cache? Tu l'as fait avec Django?N'hésite pas si tu veux, je sais pas si t'as un micro, Paul, si tu veux parler, rejoindre.
01:33:36 :Je crois que tu dois pouvoir le faire de ton côté, sinon je peux t'inviter à participer.Se prépare, dans les starting blocks. On m'entend? Du coup j'explique, c'est que quand j'héberge
01:33:56 :sur un groupe Planet Hoster, c'est ça que j'ai pris pour hébergeur, c'est que le dossiercache-by-cache transforme mon URL. C'est peut-être dans mon dossier de base que j'ai créé
01:34:13 :ce petit souci, mais si je supprime le dossier cache-by-cache, tout marche bien, parfaitement.Et si je reviens une heure plus tard, ou d'une autre IP, le dossier cache-by-cache m'enlèveun P à tout ouaps. Pourquoi? Aucune idée. C'est vraiment inconcevable.
01:34:36 :Tu veux dire dans l'URL, t'as deux P?Voilà, il m'enlève un P. Et du coup, quand j'arrive sur Internet, il me dit qu'en gros,c'est pas la bonne adresse. J'enlève un P, tout fonctionne parfaitement. Enfin, je remets
01:34:54 :un P plutôt. Et si j'enlève le cache-by-cache, tout fonctionne parfaitement.Ah, ok. Alors attends. Est-ce que je réfléchis? Si c'est pas… J'imagine quand mêmequ'à un moment dans ton application, t'avais dû avoir une version avec un seul P danston URL, dans ton fichier url.py, tu devais avoir une version avec… Envoie ton URL aussi
01:35:24 :pour voir… C'est pas dans le nom de domaine, c'est ça?Ok, hop, je vais vous mettre le lien.C'est pas dans le nom de domaine, genre… C'est dans ce qui suit le nom de domaine?
01:35:37 :C'est ça.D'accord. Donc, ok. Je pense que je… Oui, d'accord. Donc, en fait, c'est que t'as dû,à un moment… Parce que le PyCache, en fait, ça sauvegarde… Alors, ce qui est bizarre,c'est que… Parce que PyCache, en fait, c'est une version… Ça fait des fichierspyc, des fichiers compilés de tes modules, qui fait que, en fait, ça va plus vite à
01:36:03 :charger. Il a pas besoin de…Ouais, je sais parfaitement, mais c'est là où, en fait, je comprends pas pourquoilui, il me relève un P. Il…
01:36:13 :Bah, c'est que du coup, il doit…À quel niveau, quoi?C'est que, du coup, tu… Alors, pourquoi il doit te ressortir une ancienne versionde ton projet dans lequel t'avais mis un seul P?
01:36:26 :Bah, on a cherché avec mon oncle, clairement, sur tous les fichiers de toute l'application,s'il y avait le moindre endroit où, en fait, j'avais oublié un P. Il y en a pas.
01:36:37 :Donc, t'as jamais…C'est ça qui est bizarre, en fait.T'as jamais eu… T'as jamais fait une version de ton projet où il y avait un seul P?
01:36:46 :Bah, le projet, j'ai fait d'une traite. Donc, en fait, s'il y a pas… Dans la recherche,c'est qu'au final, il y avait pas avant, il y avait pas après, quoi. C'est ça qui,
01:36:57 :en fait, est un petit peu bizarre.Bah, je… En fait…Alors, c'est peut-être une erreur quelque part. C'est possible. Mais il y a aucun fichier
01:37:04 :qui s'appelle « todo app » avec un seul P. Ça, il y a aucun fichier.Bah, après…C'est une vidéo-commande.Bah, après, c'est… Là, donc, si c'est dans l'URL, ça doit être… Moi, ce que j'imagine,c'est qu'en fait, à un moment, t'as une version de ton app où, dans le urls.py,
01:37:22 :l'URL, c'était « todo app » avec un seul P. Par la suite, t'as mis deux P. Et,pour une raison que j'ignore, ton serveur te ressort un vieux fichier de cache, depycache, du coup, d'un fichier compilé qui, lui, a encore l'ancienne version avecun seul P. Moi, c'est ce que je verrais. Alors, pourquoi, après, le serveur te recréerait
01:37:44 :un fichier… ou te recréerait… Ou c'est peut-être parce que les fichiers pycache,etc., ils sont… Si tu le supprimes, en fait, quand tu relances ton projet, il va les recréer.
01:37:56 :Donc, peut-être que c'est un problème de cache directement sur ton hébergeur, quequand il recrée ton hébergeur, il va encore chercher des anciennes versions de ses fichierset pas les nouvelles. Peut-être. Mais alors là, clairement… Enfin, même moi, en gros,
01:38:14 :je suis vraiment paumé dessus. J'ai paumé. J'efface le cache, ça marche. Ça, c'estvrai. Ouais, parce que du coup, il va… C'est là qu'au final, les redirections sont bonnes.
01:38:28 :Ouais, ouais, ouais. Même quand j'ai cherché une ancienne version, j'ai jamais fait deplusieurs versions. J'ai vraiment fait du coup d'une très… C'est quoi, je l'ai
01:38:37 :juste dit au slash, c'est ça? Je veux dire ce que j'ai dit dans le chat. Alors, j'aiessayé justement l'espace… Comment on dit? Apple slash true, c'est ça? Ouais.
01:38:47 :Alors, je l'ai fait. Ça ne m'a changé strictement rien. Non, mais ça, ça ne devraitpas être le cas. Toi, tu dis… David, si tu vas sans le slash, ça ne marche pas? Moi,
01:39:01 :ça marche sans le slash aussi. Après, par contre… Attends, je vais voir. Qu'est-ceque ça fait? Ça marche. Quand je parle, les liens qui créent dans ma page sont faux.
01:39:09 :Il n'y a que les liens morts. Je ne remets pas le slash. Il met que les tout doux absentéset je mets le slash modif pour les liens modifiés. Tous les liens sont morts si je vais sur
01:39:17 :tout doupe. Et si je vais sur tout doupe slash, tous les liens sont morts. Ah oui, mais c'estque… Oui, oui. Tu veux dire oui, oui, d'accord. Quand tu modifies… C'est un gros truc.
01:39:25 :Il enlevé un caractère pour créer les URL. Il enlève le dernier caractère et il a pleinde… La nouvelle URL. Il faudrait… Du coup, si tu ne mets pas le slash, ça pète.
01:39:36 :Il faudrait voir les URL.py. Il y a des… Oui, oui. Il faudra que… Je ne sais passi tu l'as mis sur GitHub ou quelque chose du genre. Alors, là, non. Mais… Oui, je
01:39:50 :te conseille de… Parce que là, il faudrait qu'on explore un peu plus. Donc, je te conseillede le mettre dans la communauté, dans le salon de Python ou un salon du genre. Et comme ça,
01:40:02 :on va regarder plus en détail parce qu'il y a des trucs bizarres qui se passent. J'yai passé, je te dis, deux petits jours dans le week-end entièrement. Oui, mais il y a
01:40:15 :des… Je n'arrive vraiment pas à comprendre le délire. Il faut vraiment isoler le… Ilfaut voir déjà en local si ça fonctionne. Il faut isoler les problèmes. Le local marche
01:40:25 :parfaitement. En fait, c'est ça. C'est que le local, en fait, marche parfaitement.Il est en fait en hébergeur Internet. Et là, tout d'un coup, en fait, le local d'habitude,
01:40:35 :il prenait mon IP. Donc, il ne prenait pas le « to-to-apps ». Ça n'existait pas enfait dans le lien. C'était mon IP. Donc, ça passait parfaitement. Il n'enlevait
01:40:46 :pas un caractère ou quoi que ce soit. Dès qu'en gros, on est passé sur Internet,il a commencé à enlever un P. Pourquoi? Ben, oui. Il faut… Oui. Poste ton code
01:40:58 :comme ça, on va regarder parce que même le fait qu'avec un slash et sans slash,les liens soient… Enfin, fonctionnent et ne fonctionnent pas, ça, ce n'est pas censénon plus. Donc, poste le projet. Puis, je vais tester en local aussi. Je vais regarder
01:41:11 :ça. Et on va essayer d'investiguer. Je vais essayer de mettre tout ça. Et puis,quand on voit ça… Oui, oui. Et on pourra se faire un vocal dans la semaine si tu veux
01:41:23 :ou si tu as besoin. Voilà. Et petite question qui a à voir, c'est si je veux hébergerune application, une application « desktop », on va appeler ça comme ça, sur un hébergeurweb, est-ce que c'est possible? Alors, attends, tu veux dire une application de bureau? Une
01:41:49 :application de bureau qui passe par Qt, Piteside, etc. Est-ce qu'elle peut être hébergéesur du web en fait? Par logique? Non. Est-ce que c'est possible? Ben non, parce que là,
01:42:02 :c'est vraiment… Ok. Oui, c'est ça. Comme dit David, tu peux mettre un lien pour queles gens téléchargent l'application et qu'ils l'utilisent ensuite en… Mais si c'estune application de bureau, ça serait une application… Ok. C'est ce que je pensais,
01:42:17 :mais je n'étais pas sûr à 100%. Ce que tu peux faire, c'est l'inverse, c'est-à-direque tu peux faire une application web que tu intègres dans une application de bureau.
01:42:29 :Donc dans ce cas-ci, c'est ce qui se passe avec beaucoup de services. Slack, par exemple,en fait, tu as l'application web et après tu as une application de bureau que tu peuxtélécharger qui est en fait juste une façon d'utiliser l'application web en gros,sans passer par Chrome. Mais dans l'autre sens, de pouvoir utiliser une application
01:42:49 :qui a été créée pour du desktop, pour du bureau sur un navigateur web, là, je nevois pas. Pour moi, ça me paraissait logique dans ce sens, mais je préférais être sûr.
01:43:02 :Après, oui. Comme dit David. La logique, un serveur ne peut pas faire du display. Bencomme dit David, oui, tu pourrais potentiellement émuler, avoir une machine virtuelle et puismontrer ce que voit la machine. Mais ça n'aurait aucun intérêt.
01:43:17 :Ok, parfait. Je vais essayer de voir et puis je vais mettre sur GitHub.Ouais, ouais.Je t'envoie ça et puis on essaie de voir.Yes, super. Je regarde ça du coup dès que tu l'envoies.
01:43:37 :Ok, parfait. Bon, est-ce qu'il y a d'autres petites questions?Non, c'est tout bon. Bon, ben du coup, bonne soirée. Je vais aussi pour la prochaine session
01:44:00 :du coup, comme ce que vous avez peut-être vu, Lionel fera une autre session sur le,pas le Lionel qui est actuellement dans le chat, mais l'autre Lionel. Je vais vous
01:44:13 :repartager vite fait mon écran pour vous montrer que j'ai fait un salon ici, MentoratJodgo. Donc Lionel a posté le lien vers le GitHub et quelques indications. Si ça vous
01:44:27 :intéresse, vous pouvez aussi aller voir la session de Mentorat. Donc celle, la dernièreen fait. Donc pas celle-ci du coup, mais celle d'avant, les sessions précédentes.
01:44:41 :Oui, c'est celle-ci. Du coup, puisque ça c'est celle qui n'est pas encore publiée.Voilà. Celle-ci, vous pouvez aller voir en fait. Donc c'est un projet que Lionel fait
Aucune occurrence trouvée pour « ».
00:00:00
Introduction et présentation des projets mensuels
00:09:12
Aperçu de la v4 de Docstring
00:13:19
Correction du projet de Jonathan
00:38:52
Correction du projet de Lionel
01:32:31
Question de Paul sur une erreur de mise en production avec Django