Session du 05 novembre 2024 à 20h00
Veille & Discussions
Python et le typage fort
Dans cette session, on verra comment utiliser le typage fort en Python, à savoir TOUT typer
Vous apprendrez à utiliser les annotations de type pour renforcer la robustesse et la lisibilité de votre code, à identifier et résoudre les erreurs de typage avant l’exécution
00:00:00 :C'est ok pour moi aussi.Ok. Bonsoir à tous et merci d'être venu dans ce live coding événement autour de Pythonet le typage fort. Ce soir on va parler surtout du typage fort, même si le typage fort dans
00:00:27 :Python ça peut être une mauvaise façon de parler, parce que Python n'est pas un langageà typage fort, d'accord. Vous pouvez avoir des erreurs de type, c'est pas pour autant
00:00:40 :que... Vous pouvez avoir des erreurs de type, c'est pas pour autant... Alors il y a que...J'ai un écho. Est-ce que vous pouvez couper les micros s'il vous plaît ?
00:00:57 :Ok merci.Donc je disais, vous pouvez avoir des erreurs de type sur votre code Python et l'interpréteurlancera tout de même le code et il n'y aura pas d'erreur. Alors la majorité des personnes
00:01:19 :quand ils commencent à coder en Python, ils ont le typage qui n'est pas activé.Alors il faut que je le retrouve.Voilà il est là.
00:01:39 :Donc Python analysis type checking mode il est ici en basique. Donc il n'est pas activé.Ça veut dire que quand il n'est pas activé, vous pouvez faire def. Je vais désactiver
00:01:57 :supermython. Donc on peut avoir une addition, un A, B, il va retourner A plus B.Là il ne va pas me dire de typer, en fait il ne va pas gueuler, il ne dit rien.
00:02:17 :Vous pouvez par exemple créer un tuple, mon tuple, donc 1, 2, 3, 4 et lorsque vous essayezde modifier le tuple, en fait il ne vous dira rien. Parce que le typage dans Velascode,
00:02:38 :il n'est pas activé. Mais à partir du moment où vous l'activez, vous pouvez voir que mainil est dans le rouge. Pourquoi ? Parce que là il détecte qu'en fait le setItem, la méthode
00:02:50 :de setItem qui est une méthode magique au niveau du tuple, c'est pas une méthode définiedans un tuple. Ça veut dire que vous ne pouvez pas modifier les éléments d'un tuple.
00:03:01 :Et si on va plus haut, vous avez plusieurs types de mode de typage. Vous avez le basique,le standard et le strict. Et si on va dans le strict, on peut voir que lui, il va avoir
00:03:18 :des erreurs partout. Des erreurs, mais pas dans l'exécution. Alors il aura une exécutionici, il aura une erreur d'exécution ici. Mais si je fais addition de Toto et de Titi,
00:03:36 :vous l'avez compris, il s'attend, il va faire donc Python, main. Alors si je fais par un print,c'est normal. Vous voyez, il résiste. Même si moi, c'est pas ce que j'attends, c'est pas des
00:04:00 :STR. Ce que je souhaiterais, c'est plutôt des types float, par exemple. Donc là, je vaistyper et je vais dire float. Et là, il commence à gueuler. Il commence à gueuler parce qu'en effet,
00:04:15 :ce que je lui fournis, c'est pas des floats. Ce que je lui fournis, c'est des chaînes de caractère.Pour se challenger, ce soir, nous, on va mettre en strict. Donc vraiment, on va devoir tout typer.
00:04:30 :Alors moi, j'ai un fichier CSV ici. Donc c'est des matchs de foot qui ont eu lieu entre différenteséquipes avec les scores. Alors on a la date de la rencontre, le match, les deux équipes.
00:04:49 :Les nombres de points. H, c'est pour un match à domicile. A, c'est pour un match à l'extérieur.D, c'est pour une ex aequo. Et le dernier, c'est l'arbitre. Donc il faut savoir pour bien comprendre
00:05:05 :que si c'est un H, l'équipe ici, la première, c'est elle qui a gagné. Si c'est un A, c'est en jaune,c'est cette équipe qui a gagné. Donc moi, ce que je voudrais, c'est lire les fichiers CSV.
00:05:24 :Donc pour lire le fichier CSV, je vais faire un open, football.csv en mode lecture.Et je vais récupérer tous les matchs. Tous les matchs, donc CSV, file, ok, read lines.
00:05:45 :Donc si je demande à voir les matchs, on peut voir tous les matchs. Alors on voit quoi?On voit que c'est un arrêt, une liste. On voit que c'est une liste. Et la liste, elle est séparée.
00:06:07 :Donc on a chaque ligne en fait. On peut voir le retour chario, ici le retour à la ligne, backslash n.Moi, ce que je veux faire, c'est que je veux créer une liste de chaque colonne de notre CSV.
00:06:25 :Alors je vais vous montrer ce que je veux exactement.Hop, ouvrez Reston, tac, tac, tac, tac, tac, tac, il est là.Donc, ce que j'ai, c'est une chaîne de caractères, d'accord? J'ai une chaîne de caractères.
00:06:54 :Read lines l'a splittée, d'accord? Ce qui fait qu'on a une liste de chaînes de caractères.Moi, je vais faire encore un map et un split pour avoir une liste de listes de chaînes de caractères.
00:07:10 :D'accord? Donc attention, c'est une liste de listes de chaînes de caractères.Donc, pour ça, je vais mettre, je prends ça, CTRL-X, et je vais faire une liste d'un map avec une fonction lambda.
00:07:28 :Donc pour chaque ligne, je veux que cette ligne soit splittée, d'accord?Qu'elle soit d'abord strip, enlever tout l'espace inutile, et splittée lorsqu'on verra une virgule.
00:07:51 :Ça, c'est la fonction lambda, et je veux que ça se fasse sur mon CSV Read Lines, d'accord?Donc, map, c'est une fonction qui applique une fonction sur un itérable.
00:08:09 :On peut voir, il applique une fonction sur un itérable.Donc, si je regarde le résultat, vous voyez, j'ai une liste, excusez-moi, parce que quand je vous ai dit que je fais beaucoup de TypeScript en journée avec un organisme de formation, c'est pour ça que j'ai tendance à...
00:08:31 :Donc, j'ai une liste de listes de chaînes de caractères, donc exactement ça.Ok, jusque là.Maintenant, ce que je veux, c'est savoir combien de matchs a gagné Manchester United, Man Utd.
00:08:49 :Donc, je vais faire Man Utd, on va utiliser Man Utd Wins, donc les victoires, qu'on va initialiser à 0.Et je vais dire pour chaque match, à l'intérieur de ma liste de matchs.
00:09:08 :Donc, comme je vous ai dit, ça c'est un match, ça c'est un match.Donc, une liste de listes de chaînes de caractères.Donc, l'élément 0 c'est la date, ça c'est Man Utd, l'équipe, l'équipe, le score, etc.
00:09:29 :Donc, je vous ai dit quoi tout à l'heure, si c'est un H, c'est Manchester United qui a gagné.Si c'est un A, c'est Manchester.Donc, on va dire que si le match en position 1 est égal à Man Utd, et qu'en position à l'index 5, c'est égal à H,
00:09:57 :alors Man Utd Wins, on l'incrémente de 1.La même chose, ctrl-c, ctrl-v, mais c'est 2 et A.Donc, Man Utd, plus ou égal à 1.
00:10:24 :Donc, je vais afficher une string, donc Man Utd a gagné Man Utd Match.Donc, si j'affiche, alors j'ai mis à l'intérieur, excusez-moi.Donc, il a gagné 18 matchs. Jusque-là, pas de problème.
00:11:00 :Maintenant, si un développeur travaille dans mon équipe, je pars en congé et un dev ouvre mon code.Il pourrait se dire, mais attends, c'est quoi H ? Ça veut dire quoi H ? Ça veut dire quoi A ?
00:11:21 :En plus, je n'ai même pas mis de commentaire dans mon code, d'accord ?Tout ce qu'on pourrait faire, dans l'esprit du type H, de vraiment typer à fond, c'est de créer, en fait, un enum.
00:11:34 :MatchResult.pyOn va créer une classe MatchResult qui va hériter d'une chaîne de caractères et d'un enum, d'accord ?Donc, j'aurais HomeWin qui serait égal à H, AwayWin qui serait égal à A, et enfin Draw qui serait égal à D.
00:12:10 :Alors, attends, pas avec les micros parce que ça fait un bruit qui perd ses oreilles.Bon, j'utilise une énumération. Une énumération, ça sert à quoi ?
00:12:22 :Ça me permet de suivre des règles de syntaxe presque identiques à celles des objets normaux.Ça me permet de créer un objet avec les mêmes clés et valeurs lors de la conversion.
00:12:33 :Alors, excusez-moi, c'est pas du TypeScript, bien sûr.Lors de la conversion, d'accord ?L'objectif principal, c'est de signaler aux autres développeurs que ce sont toutes des valeurs étroitement liées, d'accord ?
00:12:47 :Et ça nous permet d'avoir un ensemble fixe de valeurs.Ça veut dire que je peux venir dans mon main.Alors, pourquoi j'ai mis str ?
00:13:00 :En fait, en héritant de str, les membres de l'énumération vont être des chaînes de caractères.Ça signifie qu'on peut utiliser les membres de l'énum comme des chaînes de caractères dans mon code.
00:13:14 :C'est ça l'idée.On aurait pu faire un énum tout seul, mais comme c'est des chaînes de caractères,on peut dire que matchResult va hériter de str et de énum.
00:13:23 :Comme ça, dans mon code, au lieu de mettre un hash, je vais mettre matchResult.homeWidth.Et au lieu de mettre un away, je vais mettre away.
00:13:43 :Et du coup, c'est beaucoup plus clair pour le développeur qui vient derrière moi et qui voit mon code.Il comprend que ça, c'est une victoire à domicile.
00:13:52 :Et ça, c'est une victoire à l'extérieur, d'accord ?Maintenant, on va se pencher sur la source.La source de données.On va créer une classe csvFileReader.py.
00:14:19 :Donc ça va être une classe csvFileReader.Il y aura un filename, donc le nom du fichier, qui est une chaîne de caractères.Et de la donnée, c'est une liste de listes de chaînes de caractères, comme on l'a pu le voir ici.
00:14:44 :C'est les données que je vais changer, une liste de listes de chaînes de caractères.Donc dans mon init, je vais avoir le filename de type str.
00:15:00 :Mais les données, je ne vais pas les fournir à la construction de l'objet csvFileReader.Pourquoi ? Parce que ce sera une liste vide en fait.
00:15:12 :Donc self.filename est égal à filename.Et self.data, je précise, c'est une liste de listes de chaînes de caractères.Et on va l'initialiser avec une liste vide.
00:15:42 :Maintenant, j'ai la méthode read qui, elle, son rôle est de charger les données.Donc la méthode read qui va charger les données.Donc je vais utiliser le withOpen ici.
00:16:03 :Self.filename en mode lecture as csvFile.Self.data, on va récupérer ce qu'on a mis ici.Self.data est égal à ça.Donc c'est csv.Donc la méthode read permet de charger les données.
00:16:40 :Donc j'ai mon constructeur, il a juste besoin que je lui donne le nom du fichier.Il va initialiser les datas.Donc je viens dans le mail.
00:16:53 :Tout ça, je fais appel à un lecteur.Pour être plus précis, csvFileReaderest égal à csvFileReader.Je lui donne le nom du fichier, du coup on a dit football.csv.
00:17:17 :Et regardez, en fait, je demande au csvFileReader de lire.Donc quand il va lire, il va charger les données.Où est-ce qu'il va les charger ?
00:17:28 :En fait, dans csvFileReader.data.C'est dans les datas qu'on va récupérer chaque match.Donc le but, c'est vraiment ça.On va complexifier le code, mais en gardant toujours la même sortie.
00:17:43 :Il faut toujours qu'il me dise que ManUnited a gagné 18 matchs.D'accord ?Donc maintenant, on va s'attarder sur le typage de chaque élément.Le premier, c'est une date.
00:18:07 :Donc moi, je veux que ça soit considéré comme un type date.Le deuxième, une chaîne de caractères.Ça, c'est un number, donc il me suffit de faire du casting,donc d'invoquer int.
00:18:20 :La même chose ici.H, lui, je veux que ça soit considéré comme un match résulte.Et le dernier, que ça soit une chaîne de caractères.
00:18:29 :Donc, moi je vais créer un fichier qui s'appelle utils.py.Donc je vais créer une classe DateUtils,avec une méthode statique.Donc les méthodes statiques, ça me permet, comme vous le savez,d'invoquer la méthode depuis la classe directement,sans avoir à instancier un objet de type DateUtils.
00:18:59 :Et ma méthode, c'est dateString.toDate.Donc je vais lui donner une dateString de type str,qui va me renvoyer une date, d'accord ?Un type date.
00:19:20 :Donc, je vais utiliser ce qu'on appelle le destructuring.Alors, je ne sais plus comment on l'appelle en python,je sais qu'il y a un nom propre dans javascript,on l'appelle ça du destructuring.
00:19:34 :C'est-à-dire que, moi je sais qu'en fait,ma dateString, quand je vais la splitter à chaque slash,je sais que ça va me donner trois éléments.
00:19:47 :Je sais que ça va me donner le jour, le mois et l'année.Donc je peux directement récupérer date, month, year.D'accord ?Et, une fois que j'ai récupéré les éléments,je retourne une date, d'accord ?
00:20:11 :En lui donnant l'entier de year.Alors, ça veut dire qu'en fait vous avez comprisque splitter une chaîne de caractèreme donne des éléments qui sont des chaînes de caractère.
00:20:26 :Donc là, c'est pour ça que je convertis en entier la chaîne de caractère.Le mois, la carte et enfin le jour.Donc, maintenant que j'ai créé mon dateUtils,je reviens dans mon cfgFileReader.
00:20:46 :Et ce que je veux, c'est que data soit une liste.Donc, une liste d'une liste.Mais, en fait, au lieu d'avoir une liste de listes de chaînes de caractère,je veux que ça soit une liste dont chaque élément est typé.
00:21:15 :Donc, je vais appeler dateUtils pour le premieret je vais lui dire de convertir le match,excusez-moi, match0, d'accord ?Alors, c'est pas, je vais mettre matchis.
00:21:41 :Ici, je vais l'appeler, excusez-moi, matchis0.Il va gueuler, donc, pour qu'il arrête de gueuler,je vais dire pour chaque match à l'intérieur de matchis.Donc, le premier, en fait, c'est une chaîne de caractère,je vais le convertir en date.
00:22:03 :Donc, en fait, vous l'avez compris,ce que j'ai comme liste de listes de chaînes de caractère,je vais obtenir la même chose, une liste de listes,mais cette fois-ci, ce ne sera pas que des chaînes de caractère,ceci sera considéré comme date, celui-ci comme un entier,un entier et ça comme un matchurrésulte.
00:22:24 :Donc, en fait, ce que je fais, c'est que j'écrase chaque élément,le match0, match1, etc.Le match1, je le garde,parce que c'est déjà une chaîne de caractère.
00:22:35 :Le match2, également, je le garde.Le match3, je vais le convertir en entier,parce que c'est le score de la première équipe.Le match4, également, je vais le convertir.
00:22:51 :Le cinquième, c'est un matchrésulte.Donc, j'appelle matchrésulteet j'ai une base, match, le numéro 5.Et du coup, il sera considéré comme un matchrésulte.Et enfin, le dernier, c'est l'arbitre,c'est une chaîne de caractère, je laisse celle-ci.
00:23:21 :D'accord ?C'est bon pour vous, jusque-là ?Impeccable.N'hésitez pas, si vous avez des questions,vous pouvez me couper, il n'y a pas de problème.
00:23:36 :Avec plaisir.Juste une petite remarque,il y a une fonction en Python pour parser la date,avec datetime, strp...Exactement, exactement.Ce n'est pas le type aussi bien que ta nouvelle classe,mais ça fait le boulot quand même.
00:23:57 :Complètement, je te rejoins.Alors, c'est vrai que je voulais vraiment vous montrertoutes les méthodes possibles et imaginables et tout,mais c'est vrai qu'on aurait pu utiliser strftime...
00:24:11 :Donc, je t'en prie, n'hésitez pas.Donc, on voit que data, il est souligné.Pourquoi data, il est souligné ?C'est à cause d'un problème de type.
00:24:23 :D'accord ?C'est un problème de type.En effet, je lui dis quoi ?Je lui dis que mon data,c'est une liste de listes de chaînes de caractères.
00:24:33 :Alors, vous avez vu, comme je l'avais dit au début,ce n'est pas pour autant que j'ai une erreur.Python n'est pas comme Java, C, etc.
00:24:43 :où ça va commencer à gueuleret puis ça va vous empêcher de lancer le code et tout.Non.Il faut bien comprendre que le typage dans Python,en fait, il n'apporte pas d'amélioration,il ne va pas optimiser votre code,il ne va rien faire de tout ça.
00:25:03 :Mais en fait, ce qu'on dit,c'est que c'est comme si on avait un développeur seniorassis à côté de nous qui nous disaitattention, une erreur de type,attention à ci, attention à cela.
00:25:14 :En fait, c'est pour ça que moi, je le mets vraiment à strict.En le mettant à strict,ça me challenge à vraiment faire attentionà tous ces petits détails.
00:25:24 :Mais c'est juste pendant la phase de code,ça vous permet de coder rapidement et proprement.Vous savez très bien que le typage en Pythonn'a pas d'effet dans l'exécution et tout.
00:25:36 :Mais ça nous permet de coder rapidement et proprement.Et surtout, c'est une question de maintenabilité.Donc là, il gueule.Il gueule parce qu'il me dit quedata, ok,ce n'est pas une liste de listes de chaînes de caractères.
00:25:56 :Alors, je pourrais le corriger,lui dire que c'est une liste de listes de chaînes de caractèresou bien d'entiers,ou bien de match-result,ou bien de date.
00:26:09 :Et là, il ne gueule plus.En effet, c'est bien une liste de listesD'ailleurs, j'ai bien soit une chaîne de caractères,un entier, un match-result ou une date.
00:26:23 :Ok ?En fait, notre liste peut être composée de ces types.Mais en fait, ce serait plus judicieux de créer notre propre type.Comme ça, je peux le faire évoluer facilement.
00:26:36 :D'accord ?Donc ce type, comment je vais l'appeler ?Je vais l'appeler match-data.C'est les datas de mes matchs.Et donc match-data,ça va être un tuple.
00:26:56 :D'accord ?Ça va être un tuple.Il contiendra quoi ?Une date, en premier.Un str, en deuxième.Alors, date, il faut l'importer.Un str.
00:27:14 :Un str.Ensuite, un entier.Ensuite, un entier.Ensuite, un match-result.Et enfin, un str.Donc, match-data,ça va être un tuple.D'accord ?Ça va être un tuple.
00:27:33 :Alors, un tuple, pourquoi ?C'est un choix, ça nous évite de le modifier.Parce que généralement, les données qu'on récupère,on évite de vouloir les modifier,que notre programme les empêche de les modifier et tout.
00:27:48 :Du coup, c'est un tuplequi contiendra, dans cet ordre-là,une date,une chaîne de caractère,une chaîne de caractère,un nombre, un nombre,un match-result,et une chaîne de caractère.
00:28:02 :Du coup, ici,je vais dire que,en fait,data sera une listede match-data.Alors, match-data,pourquoi il ne l'importe pas ?Match-data.C'est bizarre.
00:28:33 :Pourquoi il ne l'importe pas ?Match-data.Ok.Depuis match-data,import match-data.D'accord ?Et bien sûr, c'est un tuple.Du coup, je remplace les crochetspar une parenthèse.
00:29:00 :D'accord ?Alors, lui, on peut le virer.Alors, vous voyez,en strict,il me dit qu'il y a une erreur ici.Alors, ce n'est pas vraiment une erreur, en fait.
00:29:18 :Ce n'est pas vraiment une erreur,c'est juste parce que je ne l'utilise pas.Parce que je ne l'utilise pas,il me souligne.D'accord ?Mais parce qu'on est en mode strict.
00:29:27 :Du coup, si je regarde,excusez-moi,si je relance,vous voyez,il n'y a rien qui a craché.On continue à avoirle même nombre de matches gagnéspar Manchester United.
00:29:42 :Mais j'ai simplementtippé, en fait,mes données.D'accord ?Alors,on va mettre en place,vous allez voir qu'on peut aller plus loin.Je vais mettre en place l'héritage.
00:30:01 :Alors, pour garder une copie,je vais faire CTRL-C, CTRL-V.Ça, je vais le renommer.C'est juste pour tout à l'heure.Pour revenir tout à l'heure,je vais l'appeler Back,comme backup.
00:30:17 :Et lui, René.Voilà.D'accord ?Et ce n'est pas,c'est l'héritage.D'accord ?Si on regarde bien,c'est la partie suivante qui pose problème.Cette partie-là pose problème.
00:30:49 :Pourquoi elle pose problème ?Parce quecette partie-là est propreà ce fichier CSV.Elle est propre à ce fichier CSV.C'est-à-dire que ce typage,ce typage,ne fonctionne qu'avec ce fichier CSV.
00:31:06 :Si demain,je ramène un fichier CSVoù la date est en dernière position,le match résulte,il est en premier.D'accord ?Ici, il est là.
00:31:18 :Bref,vous voyez que l'enchaînement,les colonnes sont totalement différentes.D'accord ?Ça, ça risque de poser problème.Ça, ça risque de poser problème.D'accord ?
00:31:30 :Nous, on va donc créer une méthode.On va créer une méthodedont son rôle est de mapperle typage de chaque ligned'un fichier CSV.
00:31:40 :Donc,ce que je vais faire,c'est que je vais créer une méthodequi s'appelle MapRowqui va recevoir une ligne.La ligne,on sait que c'est une listede chaînes de caractère.
00:31:57 :Et ce qui me renvoie,c'est un match d'attente.Donc, je prends ça.Hop !D'accord ?Et je vais fairereturn ça.D'accord ?Alors, pourquoi Eagle ?
00:32:20 :Parce que, en fait,j'ai mis ligne au lieu de match.On va garder match.On va garder match.Même si j'aime bienligne, en fait,pour chaque match.
00:32:41 :En vrai, ça fonctionneparce que une liste,c'est un match de foot.D'accord ?OK ?Et, ici,on va dire quoi ?On va dire queselfDataNon, contre Z, excusez-moi.
00:32:59 :selfDataOn va faire listmapAlors, moi, j'aime bien map.C'est très puissant, map.Je trouve qu'il n'est pas assezmis en avant,parce qu'il fait pas mal de choses.
00:33:15 :Donc,et je vais lui dire d'appliquerma pro,parce que map, c'est ça.Map, c'est une fonctionC'est une classe, autant pour moi,c'est une classe,donc c'est un objetqui applique une fonctionsur un itérable.
00:33:30 :Donc, je lui dis d'appliquerla fonction qu'il a,de l'appliquersur les matchs.D'accord ?Donc,je m'ouvre le fichier,je récupère tous les matchs,et lui, il va appliquerça.
00:33:52 :C'est lui son rôle, d'accord ?C'est lui son rôled'appliquer le typeen fonction des colonnesde mon CSV.D'accord ?Et en fait, ce que je vais faire, c'est queil y a une chose qui est sûre, regardez bien.
00:34:10 :Il y a une chose qui est sûre,c'est queun fichier CSVun fichier CSVest capable de lire des données.Il est capable de lire des données.
00:34:23 :N'importe quel type de données,il est capable de lire un fichier CSV.Mais par contre, ce qu'il ne sait pas faire,c'est mapper les colonnes.
00:34:31 :Ça va dépendre du CSVqu'on va lui donner.Si je lui donne des CSV de match,il va,mon pro va renvoyerdes match data.
00:34:42 :Si je lui donne un CSV de film,il me renverra ma pro,il me renverra MovieData, par exemple.D'accord ?Donc, CSV FileReader, il est capable de lire,mais il n'est pas capable de mapper.
00:34:54 :Donc, quand un objetest capable de faire une choseet il laisse le soin à ses enfantsde faire quelque chose qu'il ne peut pas définir,on va utiliser, en fait,l'héritage avec une classe abstraite.
00:35:08 :Donc, la classe abstraite,pour ceux qui ne savent pas,c'est vraiment, j'ai une idée,j'ai un début de piste,je suis capable de faire quelque chose,mais je n'ai pas tous les éléments pour le faire.
00:35:20 :Je sais, moi, lire un fichier CSV.Je sais lire un fichier CSV, c'est simple.Je sais lire un fichier CSV.N'importe quel fichier CSV,je suis capable de le lire.
00:35:30 :Par contre, ce que je ne suis pas capable de faire,c'est de mapper chaque colonne,parce que ça va dépendre du fichier CSV.Donc ça, je laisse le soin aux enfantsde définircomment eux, ils vont mapperleur colonne,parce que moi, je ne suis pas capable de le faire.
00:35:46 :Et en plus de ça, l'avantaged'un fichier, d'une classe abstraite,c'est qu'elle n'est pas instanciable.Je ne peux pas créerdes objets de type CSV,pile reader, qui est abstrait.
00:35:58 :Pourquoi ? Et c'est logique en vrai.Si je suis capablede faire une chose, mais pas l'autre,à quoi ça sert d'avoirun objet de ce type-là,d'un type abstrait ?
00:36:10 :C'est comme, par exemple,moi, j'aime bien prendre cet exemple.Alors, je vaiswhiteboard.Moi, j'aime bien prendre cet exemple.C'est commeune forme géométrique.Une forme géométrique.
00:36:32 :Ce que je suis sûr, c'est que toute forme géométriquea un centre, que je peux positionnerdans un repère.Toute forme géométrique a un centre.
00:36:40 :D'accord ?Mais ce dont je suis incapable,c'estde calculer l'air et le périmètre,parce que je n'ai pas assez d'informationspour calculer l'air et le périmètre.
00:36:52 :Du coup, je vais créerune classe abstraiteforme, d'accord ?Et pour construireune forme géométrique, j'aurai besoinde lui donner un centre,et je laisse en abstraitle...
00:37:08 :Je laisse le soin à mes enfantsde calculer l'air et le périmètre,car je n'ai pas assez d'informationspour calculer l'air et le périmètre.Alors que le cercle,c'est bien une forme géométrique,elle a un rayon, elle a un centre,ça suffit comme information pour calculerl'air et le périmètre.
00:37:26 :Un rectangle, également.Un rectangle, il a un centre,donc c'est une forme géométrique.C'est une forme géométriqueavec un centre, une longueur,une largeur.Cet enfant est capable de calculerson air et son périmètre.
00:37:42 :Mais créer un objet formen'a pas d'intérêt, c'est trop abstraiten fait.Je crée un objet forme et après,qu'est-ce que je peux faire avec cet objet forme ?
00:37:52 :Du coup, c'est l'intérêt de fairedes classes abstraites.Des classes abstraites,ça nous permet, en fait,de ne pas les instancier,mais d'avoir une base de départpour les enfants.
00:38:06 :Du coup, moi je vais créerdonccsvexcusez-moicsvpi readerabstract.pyd'accordje vais donc créerma classecsvpi readerqui sera abstractdonc abcpour abstract base classd'accorddonc ça m'interditd'instancer un objetcsv pi readerje sais une chosec'est qu'un fichier csv
00:38:50 :je peuxje peuxje peux l'ouvrird'accordgrâce à son filenamefilename de type strhopet que sa donnéesa donnéec'est une listec'est une listede matchdataje ne sais pas pourquoi il ne veut pas me l'apporterfrommatchdata importmatch datahopd'accord
00:39:40 :c'est une liste de match dataqui sera une liste videil fautexcusez moije sais ouvrir un fichierje vais le cherchericije sais ouvrir un fichierje sais ouvrir un fichierhopd'accordmais mappéje vais en faireune méthode abstraiteabstractméthodede soinaux enfants de redéfinir
00:40:20 :comment ils veulent mapperchaque matchchaque ligne en faitd'accorddonc c'est une liste de strqui va envoyerun matchdatad'accorddoncun csv file readeril est capable d'initialiseril est capable de liremais il ne sait pas mapperil va laisserle soinà l'enfant
00:40:54 :qu'on va renommermatchreaderpareilje vais le rappelermatch readeril va hériterde csvfile readerhopdela classe abstraited'accordil n'a pas besoin d'initialiseril n'a pas besoin de lireil va laisser ça à son parentle fairemais il s'engageà redéfinir mappron
00:41:32 :et en fait c'est çales classes abstraitesqui vont servir à une based'accordpour les enfantspour les subclassesles sous classesdonc match readerhérite de csv file readerqui est une classe abstraiteetlui il s'engage à redéfinir mappronavec la méthode abstraited'accordet là du coup vous l'avez compris
00:42:04 :en fait mainil n'est pas contentcomme je l'ai dit tout à l'heureon ne peut pasinstancier une classe abstraitedu coup je vais appelerl'enfantmatch readerd'accordet en faitmatch readervous voyez rien ne se casseça fonctionneça fonctionne correctementd'accorddonc çac'est pour dire en quelque sens
00:42:44 :voilàmaintenantje peux lire n'importe quelfichier csv alors ce n'est pas vraimentvraic'est quoi le problèmevous pouvez ouvrir les microet intervenir mais c'est quoi le problème dans ma classeil y a un problème dans ma classeest-ce que vraiment elle peuttraiter n'importe quel type
00:43:14 :de fichier csvd'après vousje regarde lesje regardemais je ne vois pasen faiten fait le problèmec'est quela réponse est dans la questionest-ce que mon csvfile reader peutgérern'importe quel fichier csven fait nonnon parce queil dépend dematch data
00:43:54 :et match datail est là match dataça veut dire que c'est une datechaîne de caractère entièreje reste juste chaîne de caractèredonc non il n'est pas vraimentil n'est pasen fait il ne peut pasgérer n'importe quel typede fichier csvc'est ça son problème
00:44:16 :il est trop coupléen fait le couplageon dit qu'il estfortementcoupléà match dataet en faitc'est ça laprogrammation orientée objeton essaie toujours de définirce que c'est la programmation orientée objetetil y a David Westqui l'a très biendéfini en fait
00:44:46 :la peoça sert à quoi ? ça sert à casserle couplagefort, à éviterque des objets soientfortement dépendants d'autres objetset ça permet aussiune meilleure maintenabilitéje peux ajouterje dois être capabled'ajouter des fonctionnalitésrapidement sans avoirà casser mon code ou à le réécrire
00:45:14 :mais surtoutça sert à casser le couplage fortet pouret en faitle typagematch data il n'est pas juste informatif ?c'est à dire il n'est pas juste informatifc'est dans ton abstractméthode dans ma prosi par exempledans l'enfanttu retournes un autre typeça ne marche pas quand même ?
00:45:42 :alors ça risque de fonctionnerparce que Pythonen fait comme je vous ai ditPython il n'y a pas de problèmeau niveau du typage mais tu risquesd'avoir un souci parce que siton fichier la date est allée à la finque ManUnitedil est en premierqu'est ce qu'il va essayer de faire
00:46:02 :dans ma pro iciquand tu vas essayerde mapperen effet tu vas créer par exempleun MovieReaderadmettons que tu veux lire des donnéesde films, tu auras un MovieDatatu auras un MovieDataça risque pas de casserparce que qu'est ce que tu vas fairetu vas créer une nouvelle classe
00:46:26 :tu vas créer une nouvelle classeMovieReaderdonc pour lire des donnéesde films qui va hériter deCSVFileReaderet toi il suffit deredéfinir ma protout simplementmais t'as vu lui qu'est ce qu'il a faittout de suite il t'a proposé MatchDatatout de suite il t'a proposé MatchData
00:46:48 :pourquoi ? parce qu'il se basesur la classe abstraitedès que tu essaies de redéfinir ma protout de suite tu tapes entrermais là tu vas direje veux pas de MatchDatamoi c'est des MovieDatamoi c'est des MovieDataque tu pourrais créeret là date à la fin
00:47:08 :y'a plus de MatchResultdonc en fait techniquementça va pas se casser ton codemais à la lectureon comprend qu'il esttrop spécifiquequelqu'un qui vient lire ton codeil dit attend il lit des fichiersCSVReader qui va renvoyerdes MatchDataen fait c'est pas vraimentelle permet pas de faire
00:47:32 :beaucoup de chosesalors que toi tu leur dismoi CSVFileReader il permet de liren'importe quel fichier CSVtechniquement il va le fairemais visuellement il le fait paspourquoi ?
00:47:46 :on voit qu'il est coupléà MatchDataet en fait pour casserce couplageil suffit de transformeren faitCSVFileReaderen une classe génériqued'accord ?
00:48:04 :une classe générique c'est quoi ?c'est une classe qui va te permettrede gérer n'importe quel typen'importe quel typec'est à dire quenous on va créerun type qui s'appelle Tgrâce àtype vard'accord ?
00:48:24 :alors ctrl ztype varokdonc c'est un type qu'on appelleTet en fait notre classeCSVFileReader seragénériqued'accord ?générique de n'importe quel type Tdonc làon voit qu'on dépend plusd'accord ?
00:48:50 :on dépend plus de MatchDataon dépend d'un type Tça veut dire queCSVFileReader il est capablede lireun fichier CSV et de sortirle type que tu voudrasmais c'est visuellementd'accord ? faut bien comprendre que
00:49:08 :rien ça va se casserc'est pour ça que PITles concepts de programmationorientée, objet avancéetc, générique, interfaceprotocole etc etcça en vraic'est beauça fait beau quand vous le mettez en placeet ça permet d'écrire du code beaucoup plus propreet beaucoup plus maintenablemais techniquement
00:49:32 :si on veutça ne servirait à rien en vraion pourrait se mentiron a déjà fait des projets qui n'étaient pas trippéset c'est pas pour autant que ça ne fonctionne pasça fonctionne très bienet là en fait MatchReadermaintenant queCSVFileReaderest génériqueil me dit quoi ? il me dit d'accord
00:49:54 :regardezil me dit expected type argumentfor générique classok tu veux gérer quoi ?je veux gérer les matchsd'argentd'accord et siplus tard tu veux lire des fichiersde filmdonc MovieReaderdoncCSVFileReaderet que tu lui dis que c'estje vais écrire vite faitpour te montrer
00:50:24 :donc MovieDatac'est un tubed'accordun tube qui contient une dated'accordstr str d'accordon s'en foutet si je dis doncMovieDatace qui est bien c'est que maintenantdès que je tape MaProd'accordMaProalorslà il l'ac'est pas pour autant que c'est fauxparce qu'il prend bien un tube
00:50:58 :qui tient date ou stril s'est adapté au typetu voisalors que tout à l'heureil s'est adaptési je ne mettais pas la classe génériqueil s'est adapté à Movieà MatchDataokje ne sais pas si c'est clairon peut se direà quoi bon tout ça etc
00:51:26 :mais l'idée c'estvraimentl'idée c'est vraiment d'écriredu code propreque derrièreles autres développeurs peuventle comprendre facilementet maintenir, ajouter des fonctionnalitéstrès rapidement d'accorddoncnous on avait vul'héritageje vais terminer maintenantsur la compositiondonc il faut savoir queil y a deuxparadigmes
00:52:04 :dans la programmation orientée objeton peut utiliser soit l'héritagesoit la compositionalors il y a certainsdéveloppeursseniorsqui sont contre l'héritageje ne sais pas si vous connaissezexcusez moije ne sais pas si vous connaissezYegor Bogayenkoje ne sais pas si ça vous parleYegor Bogayenko en fait
00:52:38 :il a fait une série de vidéosil a fait une série de vidéosqui s'appelle The Pain of Europedonc la douleur de laprogrammation orientée objetça vous dit tout de suite un peule type de vidéos que vous allezregarder et en faitlui il dit par exemple
00:52:58 :il est contrel'héritageil est vraiment contre l'héritageil est contre les méthodesstatiques, il n'aime pas les méthodes statiquesil dit que c'est assezchoquant Yegor Bogayenkoparce qu'il vient en faitmettre un coup de pied dans la fourmilièrede plein de conceptsPO qu'on a vu jusqu'à aujourd'hui
00:53:20 :que ce soit les méthodes statiquesque ce soitl'héritage etclui l'héritage nonpour lui la PO ce sont desobjets qui sont composés d'autres objetsplus petits etcen fait c'est un objet composé d'autres objetsqui eux même peuvent êtrecomposés d'autres objetsmais en aucun cas il parle d'héritage
00:53:42 :et pour vous dire quepour vous dire queson examenson examen finalson examen final regardezil demande à ce que le projet soitil fasse plus de 5000 litresqu'il compile et qu'il fonctionnedoesn't have static methoddonc aucune méthode statiqueaucun getteraucun attribut publicn'utilisez pas le nom de référence
00:54:08 :bon le nom de référence c'eston le voit dans typescript dans beaucoup de langagesnous ça serait l'équivalent de nond'accord ça serait l'équivalent de nonil ne faut pas de nonque des objets non modifiableset qui n'utilisent pas l'héritagepour vous direalors il y a pas mal de trucs
00:54:26 :j'arrive à faire maisméthode statique j'ai du mal à comprendreparce que ça aide pas malles méthodes statiquesl'héritage je veux bien le comprendrefaire des projets sans héritage c'est largement faisablemais des objetsnon modifiables ça peut être compliquédoncnous en faitdans la composition dans l'héritage
00:54:48 :dans l'héritage c'est une relationest un matchReaderest un csvFileReadermovieReaderest un csvFileReaderalors que la compositionça va être une relationpossède undoncmatchReaderpossèdeun csvFileReaderet un classAPIReaderça je vous l'avais déjà montrédans un des live codingen faiton parlait des protocoles
00:55:22 :vous allez comprendre facilementc'est que là on avait répondu à la questioncomment mapperchaque colonnecomment mapper chaque colonnelà on va répondre à la questiond'où vient la source de donnéesd'où viennent mes matchesest-ce qu'ils viennent d'un csvest-ce qu'ils viennent d'une base de donnéesdonc nous c'est ce qu'on va faire
00:55:44 :on va reprendre le bacje vais créer un dossiercompositionje vais prendreça je vais le remettre à l'intérieurvoilàje vais le renommer.py
00:56:02 :d'accorddoncvous l'avez compris alors pour ceux qui n'étaient pas làpour ceux qui n'étaient pas làdans un des live que j'avais parléen faitnous on a MatchReaderMatchReader il a besoin d'un lecteuril a besoin d'un lecteurce lecteur de données c'est soitun csv file soit un api soit un reader
00:56:24 :maissi on veut faire du typagesi on veut faire du typage fortMatchReaderdoit pouvoirrecevoir n'importe quel typesoit c'est un des troisil doit pouvoir recevoir un des troismais si vous lui dites quesi vous lui dites que MatchReaderreçoit un csv filereaderd'accord un csv file reader
00:56:50 :vous venez de créerun couplage fortalors même si je répète quetechniquement il n'y a pas de problèmeest-ce que vous lui passez un objet apiou dbReaderil n'y a pas de problèmeau niveau esthétique etvisuellement en fait ça ne coïncide pasil y a un couplage fort
00:57:10 :entre votre MatchReaderet ce csv file readeret quand vous avez des objets dans la compositionquand vous voulez queun objet puisse prendre l'un des troisil suffit que les troisrespectent un protocoleou une interface dans lesautres langages mais en pythonça s'appelle un protocoled'accord
00:57:32 :on va lui dire en faitle reader doit respecterle protocole datareaderje m'en fousje n'ai pas besoin de connaître les détailsMatchReader n'a pas besoin de connaître les détailsd'implémentation de ce protocoletout ce dont il a besoinde savoir c'est qu'il contientbien des données et qu'il contient
00:57:54 :bien une méthode readle reste il n'a pas besoin de connaîtrele détail d'implémentationdu coupon va créer notrefichierDataReaderprotocole.pyet doncon va créer une classeDataReaderqui va hériterle protocoleon a des dataqui est une listed'accordune liste de listes
00:58:30 :de chaînesde caractèreset on a la méthode readla méthode readet on ne voit riendu toutet on va utiliser le ellipsisparce qu'en fait on laisse le soinà ceux qui respectent le protocolede définir le readen fait le protocole c'est çac'est l'idée même d'une interface
00:58:54 :un contrat respecte ce contratet je t'accepteje t'accepte comme objetsi tu respectes le contratDataReaderalors tu peux être utiliséchez moi il n'y a pas de problème et toutd'accorddoncMatchReaderhopon va créer le fichierMatchReader.py
00:59:22 :matchmatchreaderdonc avecmon initet lui il a besoin de quoiil a besoin d'un objetDataReaderqui est de typeDataReaderc'est toutil n'a pas besoin de savoir plusrespecte le protocoleça me suffitdonc selfDataReaderest égal àDataReaderet les matchsles matchs
01:00:04 :c'est une listed'accordc'est une liste de matchdataok comme d'habitudealors j'ai ludanshopheuj'ai lu queheuheuah ouaisMetaballil a dit que je crois que le fichiern'est pas indexé par VS Codeen fait je pense que c'est plus subtil que ça
01:00:44 :je pense que VS Code il a tendanceà se focussur des fonctions, des classes, desconstantes etc pour les reconnaîtrealors que MatchDataen fait MatchDataje dis ça mais MatchData pour luic'est juste une variablepeut être qu'il ne capte pasce qu'il a tendanceà importer
01:01:06 :des classes, des fonctionsetc et tout, peut être que c'est dû à ça...alors......MatchReaderMatchReaderdonc c'est une liste de matchqui est vide, d'accord...
01:01:28 :...alors ouais à chaque fois je fais des erreurs, excuse moi...ensuitenous qu'est ce qu'on va faireon aura une méthode LoadLoad qui va demanderau DataReader de lire les donnéesde charger les matchsdonc cette méthode Load...
01:01:50 :elle vadire au DataReaderet regardez bienc'est ça l'avantage du protocoleje n'ai pas encore codéCSVFileReader, APReader, DBReaderou n'importe, d'accordalors même s'il est làmême s'il est làmais je ne l'ai pas encorerevu. MatchReader qu'est ce qu'il dit
01:02:12 :il dit moi j'ai pas besoinde connaître le détail d'implémentationles détails ça ne m'intéresse pasMatchReader doit pouvoirlire des donnéesvoyez, comment on les lit c'est pas monproblèmec'est ça l'idée en fait qu'il y a derrière les protocolesles interfaces, c'est de pouvoirdire que MatchReader dépend
01:02:32 :d'un objet dont il n'a pas besoin de connaître les détailsluiil doit pouvoir le lire et ensuiteon doit pouvoir chargerles matchs, d'accordavec notre ERAYet on récupère ce qu'on avait mis icivoilàd'ailleurs c'est çaCTRL-Vet c'est matchalorspour chaque match dansself.dataReader.data
01:03:10 :voyezles datas sont dans le lecteurcomment ils sont c'estpas mon problèmeon importe dateUtilset matchResultd'accordet CSVFileReaderil devient quoiCSVFileReaderil peut juste lire les donnéesd'accorddonc hopCSVFileReaderil a besoin d'un filenameetCSVFileReader respectele protocole du coup c'est des chaînes
01:03:52 :de caractèresc'est une liste de listes de chaînes de caractèresde chaînes de caractèresd'accordreaderwithOpenhop ça c'est les datasd'accord c'est les datasdoncça on peut virerhopdonclà on a matchReaderdonc lui il lit les matchReaderil a besoin d'un chargeur en fait
01:04:28 :comme si on lisait un dataReaderun lecteur de donnéeslui c'est CSVFileReaderdonc lui il va lireet c'est exactement ce qu'il lui demandele matchReader il demandeau lecteur de données de lireles données est-ce que c'est une APIest-ce que c'est une base de donnéesest-ce que c'est un CSV il s'en fout
01:04:48 :il n'a pas besoin de connaître le détail d'implémentationlui il lui ditau lecteur de données de liredonc je peux bien lui passern'importe quel de ces trois typesdu moment qu'il y a chacunrespecte bien le protocoleà savoir une méthode readet pareil pourles datas en effet
01:05:10 :moi je souhaite mapperchaque ligne de matchdepuis les donnéesdu lecteur de donnéesd'accordet qui est une liste de chaînes de caractèreset du coup dans le mailen faitcomment ça va se passer dans le mailon va appeleralors dans l'ordreon va appelerj'aurais pas dû virer matchResult
01:05:38 :voilà dans l'ordreon va appeler notre csvfileReaderdonccsv fileReaderon va chercher depuis la compositionet j'ai qu'à justelui donner ce qu'il me demandefootball.csv
01:05:58 :je vais créer maintenantmon matchReadervous avez compris que lui c'est justele lecteur de donnéesc'est lui qui vaaller chercher les donnéessoit d'un csvd'une api ou d'une base de donnéeset le matchReaderdu coup c'est un matchreaderqui vient de compositionet il a besoin de quoi
01:06:26 :donne moi un lecteur de donnéesde type DataReaderdonc si je lui met Totobah il est pas contentmême si le codepeut se lancer, il peut se casser la gueule au momentoù je vais lui demander certaines informationsqu'il ne pourra pas mais il est pas content
01:06:42 :pourquoi il est pas content ? Parce que Totoregardez bien, Totoest incompatible avec le protocoleDataReader, il manqueData et il manque Readlà il faut que je lui donne quelque chose qui est compatibleà savoir mon csvfileReader et lui il est compatibleje lui demande à match
01:07:00 :reader de chargerles donnéesd'accord, alors j'aiviré une variable sans faire espritd'accord, donc je lui demande de chargerles données etil va récupérerdepuis cette fois-cidepuismatchmatchReader.
01:07:30 :matchesvous voyez on a toujoursle même résultatd'accordvoilàc'est une petite introductiondonc comme je vous ai dit sur lesintroductions, je pense qu'on a vupas mal de choses intéressantes et toutmais voilà, si vous voulez vous challengerdans le typagedans le typage fort, en fait
01:07:58 :il suffit d'aller dans votre setting.jsonde mettre python analysistype checking mode en strictet vous allez voir ça vas'allumer de partout, c'est sûrmais ça va vous challengerau niveau du typagealors c'est vrai quepour être honnêtequand on a un backgroundd'un langagecomme Java
01:08:24 :C etcet tout, on se posece genre de questionset on arrive à le mettre en placeassez facilement, on sait que c'est plus desinterfaces mais des protocolesqu'on a toujours l'idée des classes abstraitesmais en fait c'est pour vous dire quec'est pour vous dire qu'en fait
01:08:42 :on se focus plus sur les conceptsque sur le langageet qu'en fait maintenant python il est capablede suivre les conceptsavancés de la programmation rentée objetvoilà, je vous remerciesi vous avez des questions n'hésitez pasmerci à toic'était encore superje remerciemercije vais essayer
01:09:14 :d'en apprendre un peu plusje te remercieje vous souhaite une excellenteet puis voir que ça clignoteouaiscomplètement ouaisje vais vous remercierà Jonair et Pierre pour l'enregistrementje vous souhaite une excellente soiréeet puis je vous dis à très bientôt j'espèremerci, bonne soirée à toi aussi
Aucune occurrence trouvée pour « ».