Session du 23 septembre 2025 à 21h00
TOSA & Certifications
Librairie Standard & Modules
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
Session de mentorat TOSA
Nous allons revenir sur Collections, et sur la fonction issubclass
00:00:24 :J'ai R2 quand même.Ça fait un moment que je l'ai utilisé.Je ne peux pas accéder à la partie blog, mais pour l'instant, ce n'est pas trop grave.
00:00:45 :C'est curieux.Qu'est-ce que j'ai là ? Il y a déjà pas mal de monde.Salut à ceux qui sont arrivés, que j'ai pas salué.Ça m'intéresse, ce problème-là, ce que je n'ai jamais eu.
00:01:11 :C'est bizarre.Je regarde là dans mon Docker, peut-être que c'est que le volume du back s'appelle du back-end.Je pense que ça doit être à cause de ça.
00:01:28 :Ça doit être ça.Et tout à l'heure, ce que je disais à Antoine, je ferai un mentorat là-dessus.Du coup, je repars sur mon t-shirt Django.
00:01:45 :Là, j'ai récupéré une vieille base de données de quelqu'un qui était de 2011.Ce que je disais, c'est du Django 1.3, Python 2.7.Et lui, je repars sur les codes 2.0.
00:01:57 :J'ai tout recommencé, mais je vais quand même récupérer toutes les données de la base de données.Forcément, je n'ai pas un site qui existe depuis 2011.
00:02:07 :C'est un gros site de commerce et tout, donc je ne peux pas tout perdre.Et en fait, c'est pour l'anecdote du coup.Maintenant, avec Django 1.3, il y avait une méthode de HH, c'est ce qu'on appelait les mots de passe.
00:02:18 :Ça n'existe plus aujourd'hui avec Django, parce que c'est obsolète.C'est un truc qui est assez risqué.Je n'ai plus le nom, je regarde dans le code.
00:02:25 :Et en fait, quand j'ai extrait du coup toute la base de données avec les utilisateurs,quand je les réintégrerais dans la nouvelle base, forcément j'avais le vu HH qui n'existe plus avec le Django d'aujourd'hui.
00:02:35 :Donc en fait, avec Django, quand vous faites du HH, de mots de passe, dans les settings,vous pouvez dire, utilisez-t-elle HH en premier, et après, on définit plusieurs.
00:02:49 :Mais ce sera le premier qui sera utilisé en gros.Et donc, obligé de reprendre ce vu HH qui n'existait pas, qui était encore dans le code source de Django 4.2,
00:02:56 :de se le recopier-coller dans un module, et de le réintégrer dans les settings.Mais en fait, ce qui est super fort avec Django, du coup, c'est qu'un utilisateur qui va se connecter,qui avait encore son ancien HH, ça va être décodé du coup avec le système de l'ancien HH,
00:03:09 :et ça va se réencoder avec le système moderne, enfin le dernier système, tout seul.Et ça, c'est assez énorme. Je vous commenterai là-dessus.Ça permet de faire une mise à jour des mots de passe sans devoir les refaire ?
00:03:24 :Ben ouais, au fur et à mesure, tous les gens se connectent au fur et à mesure,et ça sera décodé du coup avec l'ancien système que j'ai rajouté,qui était dans Django 4.2, je crois après, dans l'été.
00:03:37 :Et après, dès qu'on se connecte, ça va se remettre avec le dernier modèle de HH, au fur et à mesure.C'est un peu stressant.On voit mon écran là ou pas ?
00:04:07 :Oui, on voit l'écran.Ok.J'ai deux idées pour ce soir, de ce que je voulais vous montrer.C'est utile en Python en général, et puis c'est utile aussi beaucoup pour ceux qui passent le Toza.
00:04:24 :En plus, comme ça, ça fait une pierre deux coups.De toute façon, tout ce qu'on fait pour le Toza, en général, c'est...Enfin, je sais qu'il y a des choses où je m'en sers dans mes projets de Django,alors que c'est du Python pur, entre guillemets,mais c'est vraiment super bien de connaître beaucoup de fonctions built-in de Python,
00:04:41 :parce que ça vous aide pas mal quand même, je trouve.Du coup, là on va...Alors, je vais lancer mon code.Je vais peut-être lancer d'ailleurs un...
00:04:53 :Mettre sur un environnement virtuel, ça sera mieux.Ouais.Tac.Alors.Hop, copilot, on va éviter ce soir.Je pense qu'on va se faire des trucs chiants à faire, on verra.
00:05:09 :Ouh, les requests.On voit que je l'ai bien utilisé.Hop là, allez.Tac.Du coup, on va commencer...Ok, on va commencer par ça.On va se faire un deck ici.
00:05:30 :Je vais peut-être agrandir un peu.Tac, hop.Les critères sont un peu petits là, je pense.C'est bien comme ça ou je vais agrandir encore ?
00:05:39 :Un peu, ouais.Comme ça ?Ouais, trop bien.Ouais, ça fait bizarre là.On va faire comme ça, c'est pas grave.Ok.Je ne sais plus à quoi je pensais aussi.
00:05:53 :Non, on va attaquer là-dessus direct.Bon, on va faire ça.Est-ce qu'il y en a qui connaissent du coup le module deck ou pas ?
00:06:04 :Pas du tout.Enfin, le module collection.Est-ce que tu en es qui l'utilise ?Non, je n'utilise pas.Non ?Est-ce qu'on va entendre quelqu'un dire oui ?
00:06:21 :Mais non, jamais.Je me suis renseigné dessus, ouais.Ok.Et tu as fait des tests avec ou sans plus ?Ah ouais, j'ai fait des tests, ouais.
00:06:31 :J'ai fait les exos sur Dockstring.Ouais.Sur Dockstring, j'avais rajouté lequel déjà ?Est-ce que c'est un exercice où il fallait rajouter une classe ou non ?
00:06:40 :Oh, je ne sais plus.C'était quoi déjà ?Non, c'était plus simple que ça.Je ne sais plus.Peut-être transformer une liste en deck alors, tout simplement, un truc dans le genre.
00:06:51 :Ouais, des trucs comme ça, ouais.Oui, oui, oui.Ça transforme une liste en deck.Et sûrement faire un append left, un truc dans le genre, ouais.
00:06:58 :Ok.Bon.On va voir que du coup, ça peut être assez efficace.Là, comme ça, je n'ai pas d'utilisation.J'utilise dans des projets, personnellement.Mais c'est comme les Zeppelins Guest, ça peut quand même être assez bien de les connaître.
00:07:14 :Alors, quand vous avez une liste, en général, une liste, on est d'accord que quand vous faites un...Quand vous faites un pop, par exemple, d'une liste, quand vous faites un pop du premier élément de la liste,en fait, on va être en...
00:07:35 :Alors, je ne sais pas si il y en a qui avaient suivi un peu mon thora sur les complexités O-N, O-1,si ça vous parle.
00:07:44 :Ça met plus de temps que les autres, en fait.Ouais.L'exécution.Ouais, ouais.Ça, c'est pas mal de s'y intéresser un peu.Enfin, beaucoup.Moi, la première fois, c'est avec Buck Denny, qui est sur le serveur Discord.
00:07:57 :On en a parlé longtemps.Et puis après, au fur et à mesure, je me suis intéressé.C'est intéressant parce que c'est vrai que quand vous avez des grosses listes,genre vraiment des grosses listes, ça peut être embêtantparce que quand vous enlevez le premier élément, le premier index, enfin le premier élément,
00:08:13 :ça va décaler tous les éléments de votre liste vers la gauche, entre guillemets.Un par un.Ça va tout décaler.Donc là, on est en complexité O-N,parce que plus vous avez d'éléments dans la liste, plus ça va être long.
00:08:26 :Pour ça, ça va ou pas ?Ça va décaler tous les numéros d'index, en fait.Ouais, c'est ça.Tous les éléments vont se décaler.Et pareil, si vous faites un insert au tout début de liste, ça va tout décaler aussi.
00:08:39 :Voilà.Donc ça, ça peut prendre beaucoup de temps.On va essayer de se faire un truc, je pense que...Je vais l'appeler comment ?Genre, imaginez, vous avez une énorme liste.
00:08:50 :Ok.Hop.Et on va se dire...Hop là.Alors, jusqu'à combien ?On va essayer de ne pas cramer le Mac.Allez.Voilà, on va se faire une grosse liste.
00:09:06 :Je pense que là, ça fait déjà une bonne taille.C'est pas mal.Donc, on va voir comment on peut utiliser DEC pour optimiser tout ça.
00:09:16 :Je pense qu'on va commencer par faire comment ?On va se créer une fonction liste sans DEC.Allez, hop, sans DEC.C'est ce que je voulais faire à la base.
00:09:31 :J'avais pris des notes de toute façon sur ce que je voulais faire ce soir.On va se faire une liste sans DEC ici.Je sais que ce n'est pas la meilleure façon de faire ça, mais...
00:09:41 :On va importer Time ici.Et on va se créer un chronomètre.Pour ceux qui veulent s'y intéresser...Pour les chronomètres, c'est plus sympa TimeIt.Pour l'heure, on va utiliser Time.
00:09:59 :C'est ce qu'il y a de plus simple.C'est peut-être un peu moins précis que TimeIt.C'est un truc un peu plus rapide à écrire.Sachant que pour ceux qui passent à Time,je crois qu'il y a un exercice où il vous demande de créer un décorateurqui doit calculer le temps d'exécution, il me semble.
00:10:17 :Ou une fonction simple, je ne sais plus.Un décorateur, peu importe.Moi, j'avais fait avec Time, ça passe.Parce que TimeIt, je ne me souviens plus par cœur comment on faisait sans notes.
00:10:26 :Et je ne le sais toujours pas.Il faudrait que je revoie un peu comment ça marche.Je n'utilise tellement jamais ce truc-là.Donc, on va faire ça avec Time.
00:10:38 :Imaginons qu'on va faire un insert, je pense.On va avoir notre énorme liste.Liste.On va se faire un insert.Je vais faire un truc comme ça.
00:10:56 :J'aime bien avoir les méta de valeur.On va se faire un liste.insert et on va se dire, à l'index 0,on va insérer, je ne sais pas, 2, peu importe, on s'en fiche.
00:11:05 :On va insérer 2.Donc là, ce qui va se passer, c'est que notre liste,on va devoir tout décaler, tous les 100 millions d'éléments.J'ai bien mis 100 millions.
00:11:15 :Ouais, c'est ça.Les 100 millions d'éléments.OK.Donc maintenant, on va se faire un start.On va se faire un start ici et on va se dire,et le end, ça va être égal aussi.
00:11:34 :OK.Et là, on va se dire, on va se faire un print ici.Donc là, on est combien ?On est 100 decks, c'est ça.
00:11:48 :OK, on est 100 decks.Donc on va se dire, je ne sais pas, liste normale,on va se mettre comme ça, normale.Et on va se dire du coup, end time, end moins start.
00:12:01 :OK.Donc maintenant, si j'appelle ici ma liste en deck, ici,et on va se mettre du coup la liste normale.OK, donc là, on voit qu'il a pris 0,25 secondes.
00:12:19 :OK, pas mal.Donc là, 0,25 secondes pour faire ça.OK.Donc, on va se refaire la même chose et on va voir comment du coup se crée un deck,ce qui n'est pas compliqué du tout.
00:12:31 :Hop.Ici, on va se faire une liste.Ouais, je ne sais pas si on peut dire ça comme ça, avec deck.Ouais, si on appelait ça comme ça, ce n'est pas très grave.
00:12:40 :OK, liste.Liste ici.Et du coup, on va prendre notre...En fait, je ne vais pas m'embêter.On va juste modifier quelques petits trucs.Hop.
00:12:56 :Hop.OK.Alors, pour faire ça, du coup, ce qu'on va faire, c'est qu'on va...Alors, je vais prendre ici notre deck.On va l'appeler deck.
00:13:04 :Et on va se dire, du coup, j'ai importé deck.Ouais, deck ici.Il y en a qui disent decker.Deck you.Je ne sais pas comment vous le dites.
00:13:12 :Et on va envoyer notre liste dedans.OK.Et ensuite, du coup, on va se faire...Donc, ça marche différemment.Donc, les decks, du coup, c'est pour travailler en fait avec les extrémités de liste.
00:13:22 :En gros, ici, on va faire un...Pour rajouter un début de liste, hop, on fait...Voilà, on a accès maintenant à append ou append left.
00:13:31 :Hop.Ce que vous n'avez pas avec les listes.Avec les listes, vous n'avez pas d'append left.Donc là, on fait un append left, par exemple.
00:13:38 :Append left.Et on va lui dire...Bon, on va faire comme notre.On va rajouter deux.Hop.On va l'appeler deck.Hop.Et bien sûr...
00:13:47 :Hop, liste avec deck, ici.Tac.Et j'ai passé mon énorme liste.OK.Aussi, il faut savoir qu'avec...Hop, vous avez append left.Vous avez pop left qui supprime un élément à gauche.
00:14:02 :Bon, le pop normal de la liste.Et le pop left qui permet de supprimer, du coup, un élément en début de liste.Ce que vous ne pouvez pas faire non plus avec une liste normale.
00:14:12 :OK.C'est bon ça pour vous ou pas ?Yes.Oui.OK.Donc vous voyez, c'est...Entre guillemets, en soi, en complexité, c'est rien de fou.
00:14:24 :C'est juste...On a des méthodes en plus, là, qui sont assez pratiques.Mais en soi, j'ai...Enfin, je ne suis pas une star, quoi.J'ai juste mis un append left, et voilà.
00:14:35 :Et puis, on lance.J'espère que vous allez voir en plus rapide, sinon j'ai l'air con.OK.Voilà.Là, on voit qu'avec le deck, c'est beaucoup...
00:14:45 :Avec un 5, ça fait du coup 0,0005 secondes, du coup.À peu près.Contre 0,25 secondes.Vous voyez un peu la différence.C'est quand même assez énorme.
00:15:03 :Est-ce que c'est bon, du coup, pour le deck ?Yes.Oui.Bon.Du coup, vous avez vu que la rapidité, elle est quand même...Je ne sais pas combien.
00:15:15 :C'est par 4 000 ou 40 000, je crois.C'est un truc comme ça, la rapidité.Là, oui.Je ne sais pas.4 000 ou 40 000, je ne sais plus.
00:15:25 :Plus de 40 000, là, je pense.Il ne faut pas être choqué.Je ne suis pas un mathé, mais cette notation-là, c'est 0,000...Il y a 4 0 avant le 4.
00:15:39 :Voilà.C'est ça.La première fois que j'ai commencé Python, je ne sais plus.Il y a un mec qui me montrait un truc.Je disais, en fait, ça ne marche pas son truc.
00:15:49 :Mais c'est parce que je n'ai pas trop l'esprit mathématique.Il a fallu m'expliquer ça.C'est 10 puissance moins 5.C'est la cinquième place après le...
00:16:00 :Après, tu rajoutes 4 0 et ça va à la cinquième place après.Oui, mais j'avoue que je n'étais pas un pro des maths avant.Un peu fou.
00:16:13 :En gros, c'est hyper rapide.Est-ce qu'on peut passer à la suite ?Est-ce que c'est bon pour deck ?Oui.La dernière fois, on a vu lequel déjà avec collection ?
00:16:25 :On n'a pas vu autre chose ?Non, je ne l'aime plus.On a vu zip, je crois.On a vu zip et zip longuiste.Et collection, on avait parlé du deck, mais on n'avait pas regardé le détail.
00:16:37 :Ok.Est-ce qu'il y en a qui connaissent his subclass ou pas ?Nous ?Non.Il n'est pas très connu en soi.Il n'est pas très connu.
00:16:51 :Je vais voir comment je vais faire ça.Ok.On va se faire du coup...His subclass, si on le prend en français, ça donne his sous-class.
00:17:05 :Oui.On ne veut pas confondre avec his instance.Ok.On va se faire un mini programme démo qui permet de voir plusieurs choses,d'ailleurs qui seront intéressantes aussi pour le clausard que vous pouvez avoir.
00:17:19 :On va essayer de cumuler plusieurs exercices.En fait, ça permet de voir si une classe est sous-classe d'une autre.Voilà.En gros, est-ce qu'elle hérite directement ou indirectement d'une autre classe.
00:17:30 :Donc, his subclass, si vous allez passer...Vous connaissez his instance peut-être.Du coup, avec his instance, vous allez...Attendez.Je vais juste accepter quelqu'un qui arrive.
00:17:42 :C'est bon.Salut, salut.Ça a marché.Ok.Je dis quoi ?Donc, his instance, vous allez envoyer une instance.Et vous allez voir, vous vérifiez si ça fait partie d'une certaine classe,si c'est un certain type.
00:18:08 :Avec his subclass, c'est qu'on n'utilise pas une instance,mais on utilise la classe elle-même.De toute façon, on va se faire une petite démo.Voilà.
00:18:16 :Donc, en gros, imaginons...J'aime bien prendre cet exemple-là parce que...C'est l'exemple que je voyais à chaque fois quand j'ai commencé la programmation.Hop.On va se créer un petit fichier AnimalBase.
00:18:32 :Hop.Donc, on va importer...Tout le monde sait comment on peut faire de l'abstraction, du coup ?Les classes abstraites ?Comme ça ?Yes ?
00:18:48 :Ouais.Oui.Avec quel module, du coup ?ABC.Ok, merci.Hop.On va importer...ABC comme ça et AbstractMethod.Ok.Donc...Je vous mets ces questions qui tombent assez souvent, j'ai remarqué.
00:19:10 :Et en plus, dans Django, je n'utilise pas directement comme ça,mais j'utilise pas mal d'abstractions, c'est assez cool.C'est assez pratique au niveau de la visibilité du code.
00:19:21 :Ok.Donc, on va se faire une petite classe animale.Hop là.Une classe animale qui réduit ABC.S'il y en a qui ne connaissent pas, il n'y a pas de problème, vous le dites.
00:19:32 :Et...Ouais, on va se faire une classe abstraite ici.Hop.Et on va lui dire, Def, parle.Ouais, ça se dit bien, parle.Et voilà, c'est pas mal.
00:19:45 :Ok.Hop.Bon, et on ne va rien faire de spécial, c'est juste pour l'exemple.Ok.Donc là, on a une classe animale.On ne peut pas instancier cette classe directement,puisque c'est une classe abstraite qui sert juste d'interface.
00:20:00 :Ça va juste servir d'interface pour avoir une interface assez unifiée dans notre programme.Donc, imaginons qu'on a ça dans notre programme,et on va se créer aussi un animal.
00:20:14 :Animals.J'aurais pu faire en français, c'est pas grave.Allez, hop.Animals, ici.Et on va avoir...On va importer du coup...Hop.On va importer une classe abstraite.
00:20:29 :Et donc, imaginons qu'il y ait un développeur qui dit,bon, allez, il y en a qui créent des classes,alors je ne sais pas, pour quel type de programme, imaginons.
00:20:39 :Hop.Animal, ici.Et il va devoir redéfinir forcément la méthode parle,parce qu'il n'a pas le choix.Voilà.Donc là, on a redéfini la méthode parle.
00:20:50 :Ouais, on va se faire un retour.Un chien.Voilà, un chien, c'est la boîte.On va se faire un retour de ouf, ici.Voilà.Et on va se prendre aussi une autre classe.
00:21:02 :Hop.Hop.On va prendre ça, ici.Tac.Ou cat.J'avais appelé comme ça.Ouais, en fait, là, je mélange un peu de l'anglais et du français,donc on va...
00:21:14 :Hop là.On va se mettre ça sur l'anglais.Speak.Speak.New.Et là, hop.Speak.Ok.Donc là, j'ai créé deux classes.Imaginons qu'il y ait...
00:21:30 :Je ne sais pas, on est plusieurs à bosser en équipe,et qu'il y ait quelqu'un qui reviendra plus tard ici pour le besoin,créer des classes.
00:21:37 :Pour l'instant, rien de spécial.On va continuer comme on était.Hop.On va se créer, du coup...On va se créer, du coup...Je ne sais pas...
00:21:49 :On peut l'appeler...Registry.Registry.Voilà.Donc, on a Registry ici,qui va nous servir, en fait,à enregistrer un peu notre trésanimalet voir s'il n'y a pas de problème.
00:22:04 :Donc, imaginons maintenant...On va le faire comme ça.Et on se fera un mail d'adresse.Voilà.Ok. C'est parti.Donc là, on a une classe.
00:22:14 :Animal.Registry ici.Animal.Ok. C'est bon.On va se dire...On va avoir une méthode init.Ok.Donc, ça va être pour référencer un peu toutes les classes qui ont été crééesdans notre programme.
00:22:29 :Voilà.Hop.Tac.Et on va se dire...Tous les animaux ici.Hop là.Animals.Ça fera une liste ici.Ok.Ça fera une liste...Alors, je ne sais pas s'il y en a qui débutent ici.
00:22:45 :Je ne suis pas sûr.Pour créer une liste.La façon standard, c'est ça.Mais j'avoue que j'ai toujours tendance à faire comme ça.Je ne sais pas pourquoi.
00:22:52 :C'est une des habitudes que j'ai.Donc, ça va être une liste.Alors, je ne sais pas.Ça pourrait être un programme.Ça pourrait très bien être un programme.
00:23:01 :Je ne sais rien.Avec des employés ou des types d'employés.Je ne sais pas.Par exemple...Ou un type de personnel.Et on aurait une classe de base.
00:23:10 :Enfin, voilà.Là, je prends des animaux parce que c'est plus sympa comme exemple.Donc, on a un animal registré.Et on pourrait très bien se dire ici...
00:23:18 :Ok.Je pense qu'on pourrait très bien se dire...Ok.On va se faire un registre ici.On va se prendre...L'animal.Allez, tout simplement.L'animal.
00:23:38 :Voilà.Et on va se dire tout simplement...Animals.Hop.On va faire un .append ici de l'animal.Voilà.Donc, voilà.Et on pourra même, du coup, créer une instance directement par exemple.
00:23:56 :Voilà.Peu importe.Et donc là, on voit notre animal.Ici, on pourrait faire un return ici pour dire...On va se mettre...La classe...Enfin, le...
00:24:09 :On va se...On va se prendre quoi?On va se prendre un...On va se dire...J'ai des idées pour montrer un peu des...Voilà.
00:24:19 :Donc, vous savez comment on fait sur une instancepour pouvoir avoir le nom de la classe d'une instance?Ou pas?Non.Ok.Donc là, imaginons...
00:24:36 :Animal ici.On pourrait très bien dire animal.Hop.Tac.On va mettre un special name.Parce que là, on va instancier ici, en fait, notre...
00:24:47 :L'animal qu'on va envoyer.Ici, on va l'instancier directement quand on va faire un append.Et du coup, après, on peut récupérer si on veut le nom de la classe ici.
00:24:58 :Voilà.Tout simplement.Alors, c'est des choses que je vois des fois dans des...Des exemples, même quand je bosse avec Delia,il y a toujours des fois, ils font des trucs que je ne voyais jamais avant.
00:25:08 :Du coup, j'ai passé pas mal de temps, il y a peut-être deux mois,à regarder un peu toutes les méthodes spéciales qu'il y avait sur les classes.
00:25:17 :Et en fait, il y en a quand même beaucoup.Je ne connais pas toutes par cœur, mais j'en ai vu pas mal.Donc voilà.Donc là, actuellement, on a ça.
00:25:24 :Et...Hop.Tac.On va se faire un touch ici et on va voir le main.Donc...Et comme ça, on pourra voir un dernier truc avec ça.
00:25:36 :Ok.Donc, dans le main, ce qu'on va faire ici, c'est qu'on va importer...Hop.Notre...Régistry, c'est ça ? Voilà.Et je l'appelle comment d'ailleurs ?
00:25:48 :AnimalRegistry.Voilà.On va importer ici...Nos...Animaux.J'avais créé qui tout à l'heure ?J'avais créé...DoggyCat.Ouais, j'imagine.Le plus basique, quoi.Des exemples qu'on voit partout, en fait.
00:26:08 :Voilà.Et du coup, on va se dire...Donc, on va se créer, du coup, notre...Un registry, ici, qui va être, du coup, AnimalRegistry.Hop.
00:26:17 :Voilà, notre classe qui était ici, qui va nous permettre d'enregistrer nos animaux dedans.Alors...On fait comme ça, c'est un peu bizarre, mais imaginez que c'est un programme hyper sérieuxet que, du coup, toutes nos classes sont enregistrées.
00:26:29 :Alors.Maintenant qu'on est là, ce qu'on peut faire, du coup,c'est faire un print, ici, de...Registry.J'appuie Register, la classe, voilà.Et on va envoyer...
00:26:42 :Chien.Hop.Et après le chien, on va envoyer le chat.Tac.OK, et normalement, si...OK, donc le DoggyCat, ils ont bien été enregistrés, il n'y a pas de problème.
00:26:58 :Imaginez, donc, qu'il y ait quelqu'un qui reprenne le programmepar la suite, qui arrive ici, et...Je ne sais pas, il ne fait pas attention, en fait.
00:27:05 :Si vous avez plusieurs programmes dans l'entreprise,il arrive, hop,il va vous créer un...Un robot.J'ai oublié bien cet exemple.Hop.Il blue l'héritage carrément, il fait une méthode...
00:27:18 :Je pique, hein, pareil.Hop.Il fait un peu n'importe quoi, tac.Et il fait un retourne...Je ne sais pas, ça fait quoi, un robot ?
00:27:26 :Ça fait quel bruit ?Venez, je n'ai pas d'idée, là.Hum.Un bling, bip...Bip, bip, bip, bip.Allez, hop.Tac.Et là, on a un robot.
00:27:38 :OK.Donc...Le problème ici, c'est que si je retourne ici...Hop.On est content, on a fait un robot.Tac.Hop.OK.On va instantier le robot.
00:27:54 :Nickel, ça marche.Voilà, donc là, tout fonctionne.Sauf que nous, ce n'est pas ce qu'on veut.Donc, c'est pour ça qu'en fait, il faut avoir, entre guillemets, des sécuritéspour vérifier quand vous avez des cas d'héritage comme ça, des cas d'interfaceoù tout va arrêter d'être d'animal, ici.
00:28:07 :Hop.Vous êtes ici.On va faire un petit peu de l'espace, tac.Et on peut très bien se dire...On va se mettre une condition.
00:28:15 :On peut dire, si ce n'est pas une sous-classe ici...Donc, on va prendre notre animal qu'on a ici en argument.Hop.Et on va dire que nous, on veut que ça soit animal.
00:28:29 :Animal.Hop.Donc, il faut peut-être que...Si je ne l'ai pas importé, ça risque de...Hop.AnimalBase, ici.OK.Tac.Donc, si ce n'est pas une instance...
00:28:45 :Enfin, si ce n'est pas une classe, justement, une sous-classe du animal,on peut se dire...Hop.C'est l'un des plus connus.TypeError, voilà.On peut se dire...
00:28:53 :On va faire comme tout à l'heure, tac.La classe...La classe...Hop.Vous faites ça.On était où ?Animal, ici.C'est ça.Hop.Tac.
00:29:07 :Name.Voilà.On n'est pas...Ou doit hériter...Je ne sais pas.Doit hériter...Doit hériter...D'animal.OK.Donc là, quand vous faites ça...On est où le main ?
00:29:24 :Il est là, tac.OK.Donc là, vous voyez, vous avez une sécurité qui vous dit...Qu'est-ce que j'ai fait ?Animal.J'ai fait une connerie avec mes strings, non ?
00:29:36 :Est-ce que j'ai fait une connerie avec mes strings ?Je n'ai pas fait gaffe.Je te réjouis.Ah.Pastille.Ah.OK.Euh...J'ai un doute.
00:30:00 :Si quelqu'un voyait quelque chose que j'ai loupé.Ah non, c'est bon.Je n'ai rien dit.Je n'ai rien dit.Elle est là.Je n'ai pas vu.
00:30:12 :Je n'ai rien dit.J'ai eu peur.Je ne voyais pas cette ligne.Ah bah pourtant, elle est en violet.OK.C'est bon.Donc voilà.On a bien cette sécurité qui dit qu'il faut que ça hérite d'animal.
00:30:22 :Après, est-ce qu'il y en a...Donc du coup, c'est bon pour le...Là, en gros, ça vient bien vérifier que dans l'héritage, on hérite quelque part d'animal.
00:30:32 :Mais ça marcherait s'il y avait du multi-héritage.Si vous avez une classe B qui hérite de A, une classe C qui hérite de B, ainsi de suite, ça va fonctionner.
00:30:39 :C'est ça qui est assez puissant, en fait.Est-ce que pour vous, c'est bon ou pas ?Oui.Si vous voulez, je pense que je peux revenir plus doucement.
00:30:50 :Sinon aussi, est-ce que vous êtes à l'aise avec les tests ou pas ?Comment on pourrait tester ça ?Différemment.Sans exister le programme, en fait.
00:31:05 :Juste avec des tests.Donc on lance pas le programme, on va juste lancer des tests.Est-ce que vous êtes bien habitués avec ça ou pas ?
00:31:10 :Non.OK.Alors.J'avais fait quand ?C'était pour quoi déjà ?Je ne sais plus.J'avais fait un mentorat, mais je crois que c'était en début d'année.
00:31:24 :J'avais fait un mentorat, je ne sais pas s'il y a quelqu'un qui l'ait suivi, mais je ne suis pas sûr.Où je montrais, moi perso, quand je fais une application.
00:31:34 :Par exemple Django, puisque c'est ça 95% du temps.Django, j'ai toujours des cards dans GitHub.Et mes cards, ça va correspondre à une fonctionnalité que je vais développer.
00:31:46 :Et avec chaque card, je ne mets pas la carte en terminé si je n'ai pas fait les tests qu'ils font avec.Je fais toujours des tests en même temps que mes fonctionnalités.
00:32:00 :Il y en a qui font du DDD, qui font carrément faire les tests avant.Moi, ce n'est pas forcément mon truc.Je vais plutôt faire les tests soit en même temps ou quasiment en même temps.
00:32:09 :J'avais montré qu'il faut utiliser basiquement GitHub Action pour déclencher ces tests.On va avoir un fichier qu'on va appeler testanimals.Animals, ça peut être pas mal.
00:32:38 :Ici, en bulletin, vous avez unitest avec Python.Je ne vais pas l'utiliser parce que je n'utilise jamais unitest, j'avoue.A savoir que pour le Toza, si on vous demande comment on peut faire des tests avec les librairies standard Django, c'est unitest.
00:33:00 :Mais vous n'aurez pas de tests à éclair, j'ai jamais vu en tout cas.Perso, je n'utilise pas ça.Moi, ce que je fais, c'est ici.
00:33:07 :Peut-être qu'il y en a qui ont une idée.J'utilise PyTest.Comme pour faire le projet de boutique de e-commerce dans la formation Django ?Thibaut utilisait PyTest, non ? Je ne sais plus.
00:33:26 :Je n'ai pas encore vu cette partie, mais Thibaut, s'il y avait la partie test de Django.Non, c'est bien parce qu'il montre la partie unitest.
00:33:34 :D'accord.Donc, c'est carrément des classes de Django, je ne sais plus, de testcase, je crois, qui héritent de unitest, il me semble.En fait, je faisais tous mes tests au début, mes projets étudiants avec unitest.
00:33:47 :Je faisais ça pendant longtemps.Et en fait, il y a un mec un jour qui m'a dit, vas-y, arrête, passe à PyTest, c'est chiant parce que tu trouves un petit systèmeet tu vas voir, après, tu ne pourras plus revenir à unitest.
00:33:57 :Effectivement, maintenant, unitest, je ne veux plus l'utiliser parce que je ne l'utilise plus du tout.Et je ne veux plus forcément l'utiliser du coup.PyTest, c'est quand même beaucoup plus pratique.
00:34:08 :Je trouve, c'est quand même carrément plus pratique.C'est plus concis, je trouve.C'est plus naturel que de faire des classes de test avec des setups.
00:34:18 :Je ne sais pas si on utilise unitest, mais faire des gros setups, on peut en reparler.C'est à une fois un mentorat.Je ressortirai mes vieux projets où j'utilisais des tests Django.
00:34:29 :Et comparer à des tests PyTest.C'est quand même plus sympa.Du coup, on va importer PyTest.Et promis, après, je ne vous embête plus, on se tient là-dessus.
00:34:42 :Et on va importer Animals.J'avais appelé comment ? Animals, je crois.On va importer nos dogs.On peut avoir des données test.On peut faire exprès de créer des...
00:35:00 :Imaginons que le robot, c'est une erreur.On fait exprès de créer un robot dans les tests.On pourrait très bien, entre guillemets, créer ce qu'on appelle une...
00:35:08 :Je n'aurai pas le temps de le montrer, ça risque d'être un peu fou.Si on parle là-dessus, on fera un mentorat sur les tests, si vous voulez.
00:35:16 :Du coup, évidemment, là, on importe Animals.Mais pour les tests, on va directement utiliser des classes de tests.On ne va pas utiliser des classes qui sont en vrai programme.
00:35:28 :Oui et non.Oui et non.Pour ce cas-là, ce que j'aurais fait, c'est que j'aurais des classes qui vont être d'animal en test.Et une robot qui n'hérite pas d'animal.
00:35:38 :Exprès pour voir si on teste bien le cas où on a bien une classe qui n'hérite pas d'animal.Donc, on va rester simple pour l'instant.
00:35:47 :Et on va...J'ai appelé Registry.On va importer notre Animal Registry.Donc, les tests.Alors, pour faire les tests, ici, basiquement, on peut très bien se dire...
00:36:00 :Notre test doit toujours commencer par Test.Valide.Animal.On va tester le cas où il n'y a pas de problème.Donc, on va avoir un Registry.
00:36:15 :Le fait que le test commence par Test, c'est une convention ou c'est vraiment...Non, non.Non, alors il faut le faire comme ça.Il faut le faire comme ça, sinon il ne sera pas reconnu.
00:36:27 :On pourra faire le test.Mais...Alors, c'est un peu plus poussé quand tu fais des...Alors...C'est un peu plus poussé, par exemple...Quand tu as des tests, en fait...
00:36:47 :Il est où ? Je ne sais plus. Il est là.Voilà.Donc là, je vais, par exemple, le dire pour les fichiers.Alors, les fichiers s'appellent aussi Test.
00:36:54 :Mais sur des gros projets avec PyTest et Django, en fait, j'ai carrément...Je lui dis, tu peux reconnaître les fichiers qui commencent par Test.Et après, peu importe.
00:37:02 :Ou tu peux très bien faire l'inverse, genre...Asterix underscore Test.Moi, j'aime bien toujours faire comme ça.C'est toujours Test underscore...Voilà.Et la suite.
00:37:13 :Donc, ce que je disais, c'est que juste pour la...Pour remettre dans le contexte, en fait, mes tests...J'ai un dossier test exprès.Genre, dès qu'on le teste...
00:37:22 :Donc, ça, c'est des données, en fait...C'est des données uniquement pour les tests que je ne vais pas utiliser dans mon application.Voilà.Et qui seront ensuite, après, utilisées directement dans les tests courants.
00:37:35 :Voilà.Sauf que là, pour notre cas...Notre cas, notre cas, notre cas...Notre cas qui est où ?On est le 23, ouais.C'est ça.
00:37:47 :Dans notre cas, là, je fais un truc un peu plus simple, un peu plus à l'arrache, quoi.Mais c'est juste pour montrer un truc qui est intéressant avec les tests.
00:37:54 :Je voulais juste montrer un truc, en fait.Je vais le faire.Donc, on va faire un truc basique.On va se dire...Alors, comment c'est déjà le message que j'ai mis ?
00:38:05 :Ah, il veut mettre carrément le...Voilà.Ok, ça nous met animal...Ok.Le message, c'est animal name enregistré.Ok.Alors.Donc, là...Hop.Donc, là, on va dire...
00:38:26 :Si on fait...Je ne sais pas, on va dire ça.Hop.On va se dire...Bah, dog enregistré, c'est ça.Ok, nickel.Merci.Donc, là, on va dire...
00:38:36 :On va essayer, si on a bien...Ah, mais là, non, ça ne passera pas.C'est chiant, là, par contre.Hop.Voilà.Donc, là, maintenant, si je fais ça...
00:38:50 :Ok, j'ai un test qui est passé.Parce que, du coup, ici, on vérifie bien qu'on a bien ce message-là.Et quand on utilise notre méthode ici...
00:39:02 :On pourra même faire comme ça.Je n'aimerais pas faire comme ça, du coup.Je préfère faire comme ça.Ça serait plus parlant pour moi.Enfin, comme vous voulez, mais après...
00:39:12 :Voilà, ça me passe.Voilà.Comme ça, on sait qu'on a ce message-là.C'est bon, il n'y a pas de problème.Là, c'était juste pour vous montrer.
00:39:20 :Et si je fais ça, par exemple, ici...Tac.Si je fais ça...Ok, je n'ai pas de test qui se lance.Je viens d'appeler test.
00:39:30 :Bon, là, c'était juste pour faire le petit démo avec le test.Mais, moi, ce que je voulais faire, ce n'est pas ça.Je voulais vous montrer ce qui est intéressant avec PyTest.
00:39:41 :C'est qu'on va se faire, carrément, ici...Hop.Un valid...On va l'appeler robot.On aurait pu l'appeler un valid class, mais on va le mettre...
00:39:50 :On va mettre le robot pour avoir notre exemple.Et là, on va...Hop.On va se faire, ici, une instance d'animal registré.Et donc, ici, vous pouvez utiliser...
00:40:02 :Hop là.C'est pour ça que je voulais vous montrer les tests.En fait, on peut directement tester les erreurs avec PyTest.On ne teste pas que ce qui marche.
00:40:11 :On teste aussi, entre guillemets, ce qui ne marche pas,mais d'un côté, c'est que ça marche.Du coup, c'est que notre fonctionnalité, elle marche.Une vérification.
00:40:20 :Donc, on peut très bien se dire...C'est raise, c'est ça.Et là, on peut vérifier que PyTest va lever une type erreur.Ici.Quand...Quand on ferait un registre...
00:40:34 :Hop là.Il est où, mon registre ?Registre, là.Euh...Ouais, non, ça ne fait pas.C'est plus registre.Voilà.Hop là.Tac.Hop là.
00:40:51 :OK.Quand on fait un registre, ici, de la classe...Robot.Donc là, euh...Si je lance, du coup, mon test...Voilà, il passe.Hop.Après, je ne sais pas...
00:41:07 :Hop.Si je fais ça, par exemple...Voilà.Là, il n'est pas d'accord parce qu'il voit très bien que, en fait,ça ne lève pas une zéro de vision erreur.
00:41:19 :C'est bien une type erreur qui est levée.Hop.OK ?Donc, en fait, vous pouvez vérifier aussi, dans vos tests,que quand vous levez, ici, une erreur,ça se teste, ici, avec PyTest.
00:41:33 :Voilà.Bon, là, je suis conscient que le test a été fait un peu à l'arrache,dans le sens où j'importe tout directement de mes programmes.
00:41:41 :Sachant que, dans les tests,vous n'allez pas forcément...Vous n'allez pas créer une classe...robot...Enfin, vous n'allez pas le faire, le votre test, comme ça.
00:41:53 :Vous aurez eu avant un fichier, ce qu'on appelle ConvTest,avec des classes de tests,des classes qui hérissent de l'animal, d'autres non.Et puis, vous aurez utilisé ça, quoi.
00:42:01 :Voilà.Mais bon, là, c'était pour...J'ai pris un gros raccourci.Mais est-ce que vous avez compris le principe, du coup ?C'est bon pour les tests ou pas ?
00:42:08 :Oui.C'était rapide ?Oui.Yes.C'était un petit peu rapide.C'était vraiment juste une petite...Pour voir, entre guillemets, un petit truc complet,avec un petit ABC,un petit subclass ici.
00:42:25 :Hop.Bon, là, on l'utilise.Et avoir un petit coup de paillet test, ici, au passage.Voilà.Donc, voilà.C'était un mentorat plutôt, entre guillemets,assez cool.
00:42:36 :On n'a pas fait de trucs très compliqués.Mais est-ce que ça va,ce format-là, ou pas ?Ça va.Ça vous a aidé ou moyen ?
00:42:50 :Oui.Moi, ça m'a rafraîchi, en fait.Donc, allez voir.Ça fait des rappels sur un peu de...Ça a rappelé pas mal de choses sur pas mal de petites...
00:43:01 :Pas mal de petites choses.Et du coup, ça fait du bien, aussi.OK.J'avais prévu de faire ça ce soir,pour changer un petit peu.
00:43:08 :Je sais pas.Ça m'est venu d'un coup.Je me suis dit, on va faire un peu d'ABC.J'ai pris quelques notes, comme ça.Puis, voilà.
00:43:15 :Ça allait bien.C'est plus clair, ça, je trouve.OK.Nickel.Est-ce qu'il y a des questions, par hasard ?Non.Cool.Non ?Non.OK.
00:43:30 :Nickel.Pour la partie test,dites-vous bien que là, j'ai fait ça,vraiment,de manière très raccourcie,un peu à la bourrin.Donc, on fera un truc plus proprela prochaine fois.
00:43:42 :Est-ce qu'il y en a qui ont l'habitudede tester, ou pas, ici ?Ça m'intéresse, ça.Bon, toi, du coup,je m'imagine,t'as un test.
00:43:51 :Moi, j'ai commencé à testersur le StockManager.Ouais.Et avec ConfigTest, en fait.J'avais 20 tests, à peu près.D'accord, ouais.Après, ouais,les tests, c'est important pour voirsi votre truc,s'il y a une chose qui casse.
00:44:11 :Sur ce projet-là,que je n'ai pas touchédepuis très très très longtemps,je ne sais même passi les tests vont encore fonctionner.Faut que je revienne dessus.
00:44:20 :Ah ouais, non,il faut que je revoie mon environnementvirtuel, en plus, je pense.Ouais, il y avait 109 testsdans celui-là.Donc, comme quoi,c'est assez importantde faire çaparce qu'il n'y a pas longtemps,sur un gros projet,pareil,100 tests,il y avait comme ça.
00:44:36 :Je ne sais plus,j'avais touché un truc,je me suis dit,c'est bon, c'est pas grave.En fait, j'avais cassé,j'avais cassé deux, trois trucsdedans, en plus.
00:44:44 :Donc, voilà.Je suis en train de faire,de finir sur Django,le projet d'e-commerce.Du coup, il y a des tests dedanset après,vu que ça en parle,je vais faire aussi,il y a une partie de formationqui est sur le testet je vais y aborder.
00:45:02 :Du coup,je n'ai pas encore trop touché, ça.Ouais, ok.Oui, tu as raison,c'est vachement bien de faire ça.Moi, c'est un mecqui m'a bien boosté aussiparce que,il y avait Thibautet une autre personne aussiqui m'ont dit,ouais, les tests,elle met l'accent dessus
00:45:17 :parce que c'est important.Du coup,il y avait au moins deux,trois personnesqui m'ont dit,ouais, qu'ils aient les tests,du coup, je crois.
00:45:24 :Il me semble qu'il y avaitChristophe,Antoine,Jérémy,il y en a d'autres aussi ou pas ?Non, vous êtes trois,ouais, on est onze.
00:45:33 :Donc,et je vois plein de gens mêmequi,alors ça, c'est quelqu'un,une fois,pour qui je bossais,comme quoi c'est important,une boîte,et en fait,c'était il y a moins six mois,donc je faisais,ça faisait que depuis deux ans,ça fait deux ans et demique je fais du code,
00:45:49 :ça faisait que deux anset la fille,elle a vu que je faisaisplein plein de testsdans les programmeset elle, c'était une senior.
00:45:55 :Elle m'a dit,franchement,c'est cool de voir des juniorsqui font du test, quoi.Et en fait,ce que j'ai cru comprendreet ce que je vois de plus en plus,c'est qu'il y a plein de gens,là, je suis en trainde reprendre un programme,où en fait,
00:46:06 :il y a soit zéro test,soit deux tests,et donc,c'est compliqué à voirquand on teste un truc,du coup, après.Donc, voilà.Bon, je serai voirun petit mentorat test,du coup,la prochaine fois.
00:46:20 :Je pense que c'est important,surtout quand il y ades gros gros programmesavec beaucoup de,pas mal de fichiers,comme les trucs Djangooù il y a des fichiersun peu partout,c'est l'erreur,on ne sait pas forcémentoù elle est.
00:46:31 :Ouais, ouais, ouais.Les tests pour savoiroù sont les erreurs,surtout si on faitdes modifications,surtout si on travailleà plusieurs, en plus.Bah ouais, sinon,tu vas, à chaque fois,un bug,tu vas découvrir bug par bug,et ça, c'est un peu chiant,ça.
Aucune occurrence trouvée pour « ».
00:01:39
Discussion autour de Django 1.3 et le hash obsolète
00:05:04
deque du module collections
00:18:49
classe abstraite ABC
00:24:10
Méthode spéciale __name__ des classes
00:26:48
Utilisation de issubclass
00:30:57
Exemple avec un test pytest