Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Dans cette partie, on va implémenter des dataclasses pour la gestion de nos données.Alors ça marche très bien sans pour l'instant, mais pourquoi on va vouloir passer par des dataclasses ?
00:00:09 :Et bien tout simplement parce que le code sera beaucoup plus facile à lireet par la suite ça évitera également des erreurs si on manipule ou on change des éléments sur le code.
00:00:17 :Pour vous montrer l'intérêt des dataclasses, j'ai prévu un petit exemple simple iciqui va tout de suite vous montrer l'intérêt de passer par des dataclasses plutôt que par des dictionnaires,même si les dictionnaires sont un format de données très polyvalent.
00:00:29 :Dans ce cas-ci, il est un peu trop polyvalent.Par exemple ici, on a une dataclass Movie qui a deux champs ici, Time et Format,qui sont indiqués avec une chaîne de caractère.
00:00:40 :Déjà ça nous permet avec les dataclasses de définir le type que doivent avoir ces champs,ce qui n'est pas le cas avec un dictionnaire où on peut mettre vraiment tout ce qu'on veut dans la valeur associée à une clé.
00:00:50 :Également là, on spécifie bien qu'on a uniquement deux champs qu'on veut,donc le Time et le Format, alors qu'avec un dictionnaire, on pourrait en enlever un des deuxou en rajouter un troisième et ça ne poserait pas de problème.
00:01:01 :On a aussi un avantage par rapport à l'accès aux clés.Par exemple avec un dictionnaire ici, si j'essaie d'afficher l'horaire comme ça,je vais avoir une erreur parce que cette clé n'existe pas.
00:01:11 :Il faut vraiment que je me souvienne à chaque fois de quel est le nom exact des clésparce qu'on ne va pas avoir d'autocomplétion.Là c'est facile, on a le dictionnaire qui est défini juste au-dessus,donc on voit bien qu'on a uniquement Time et Format,mais bien souvent le dictionnaire est créé ailleurs et on ne voit pas directement la définition.
00:01:26 :Donc il faut vraiment se rappeler ou retourner voir dans le code quel est le nom précis de la clé.Avec une Data Class, ici on a l'autocomplétion,donc si je mets un point, je vais avoir directement tout ce que je peux utiliser,notamment le Format et le Time ici,
00:01:39 :alors qu'avec mon dictionnaire à ce niveau-là,je vais avoir toutes les méthodes qui sont sur un dictionnaire,donc Clear, Items, Get, etc.Donc c'est beaucoup plus simple pour éviter ce genre de problème.
00:01:50 :Également lors de la création, là je vais avoir une erreur si j'oublie de spécifier le formatquand je crée une Data Class.Là encore, avec un dictionnaire, ce n'est pas le cas.
00:01:58 :Je peux très bien créer un dictionnaire sans le formatet ça va quand même fonctionner au niveau de la création.Ça offre beaucoup plus de souplesse également pour donner des valeurs par défaut.
00:02:06 :Ici, je pourrais dire que je veux un field qui par défaut a une valeur de 2D,ce qui me permettrait ici de ne pas forcément le définir.
00:02:12 :Donc là, dans ce cas-ci, on n'aurait pas d'erreursi on créait une Data Class à partir de Movie de cette façon,puisqu'on a donné une valeur par défaut ici.
00:02:19 :Donc voilà seulement quelques petits exemples.Il y a d'autres exemples après dans lesquels on pourrait rentrer,mais je ne veux pas faire trop long, notamment au niveau de l'export.
00:02:26 :Si après vous avez des façons d'exporter vos Data Class,vous pouvez faire une méthode à l'intérieur de votre classepour avoir quelque chose de générique.
00:02:33 :Là encore, avec un dictionnaire, il faudrait créer une classequi permette d'avoir ces méthodes spécifiques,mais finalement on reviendrait à créer le fonctionnement d'une Data Class.
00:02:41 :Donc pour toutes ces raisons, c'est beaucoup plus simplede passer directement par ce mécanisme qui est fourni par Pythonet c'est ce qu'on va implémenter dans cette partie sur notre script.
00:02:50 :On va donc utiliser notre IA pour pouvoir créer ses Data Class.Donc j'ai déjà mon prompt qui est prêt, je vais juste le copier ici.
00:02:58 :Vous voyez que j'ai déjà indiqué les modèles que je veux.Donc là encore, on va cadrer l'IA pour ne pas qu'elle fasse un peu n'importe quoi.
00:03:05 :On va lui donner déjà des noms de classes qu'on a décidé auparavantet on va lui indiquer ce qu'on veut ranger dans chaque classe.Donc elle serait peut-être capable, cette IA, de deviner tout ça elle-même,mais c'est mieux de quand même orienter le script vers ce qu'on souhaite.
00:03:20 :Donc j'ai ces classes ici que je vais lui passeret je vais également lui dire de mettre tout ça dans un fichier séparéparce qu'on va commencer à séparer notre script entre plusieurs fichiers.
00:03:29 :Donc dans ce cas-ci, je veux créer un fichier Models,donc je vais lui dire « Peux-tu mettre ces Data Class dans un fichier séparé,par exemple Models.py ? »
00:03:40 :Donc je lui dis ça, je « Submit » et là on va lui laisser faire le gros du travail,c'est-à-dire créer les classes avec toutes les infos qu'il faut dans les classesen fonction des données qu'on va récupérer.
00:03:50 :Donc là, on lui a donné les noms des classes et ce qu'elles doivent contenir.Après, vous voyez que là, en fonction de ce qu'on a déjà récupéré,le titre, le genre, le synopsis, etc.,
00:03:58 :il va correctement voir qu'est-ce qu'on a comme données,que ce soit des chaînes de caractère ou un dictionnaire pour le Portrait Imageparce qu'effectivement, on avait plusieurs images qui étaient disponibles.
00:04:08 :Là, dans notre cas-ci, ça va être juste l'image au format Portrait,mais on pourrait avoir également le format Landscape.Après, il va falloir qu'il remplace à l'intérieur de notre scriptles endroits où on récupère des informations pour l'instant avec des dictionnaires simplespour utiliser à la place ces data classes.
00:04:24 :Là, il a presque fini.Si on regarde déjà le script qu'il a fait, il a bien créé un nouveau fichier Models.py.On va aller voir ce fichier et on va aller voir ce qu'il a mis dedans.
00:04:34 :On a bien nos classes avec les bons noms tels qu'on les avait indiqués.Là, vous voyez la puissance des data classes et qu'on peut spécifier directement le type.
00:04:42 :On peut également avoir certains types ici qui vont être dépendants d'autres data classescomme par exemple ici, on a un cinéma qui va avoir des sessionsqui vont être une liste de sessions telles qu'on les a définies juste au-dessus.
00:04:52 :Et on va avoir la même chose pour les schedules ici qui vont contenir une liste de cinémaet pour les movies qui vont contenir une liste de schedule, etc.
00:04:59 :Et là, à la fin, on a le Export Data qui va contenir la liste des movies.Vous voyez, on y va dans le sens inverse.
00:05:04 :On a une liste de films.Les films contiennent des données d'horaire, donc des schedules.Les données d'horaire contiennent les différents cinémaset les différents cinémas ont chacun des sessions avec les différents horaires et les différents formats.
00:05:15 :Et finalement, on a le Movie Metadata ici qui va être lié au movie.Donc là, on voit qu'on a bien l'indication du type Movie Metadataqui va contenir toutes les informations sur le film pour qu'on puisse les afficher en front-end.
00:05:25 :Si je vais voir maintenant dans le mail, je vais afficher ici dans l'IA qu'est-ce qu'il a changé.Donc là, vous voyez que plutôt que de faire ici tout simplement un dictionnaire,là on a par exemple un dictionnaire cinéma avec les clés Name, Session,à la place, on va créer des data classes.
00:05:40 :Donc là, par exemple, cinéma avec un nom qui va être associé à cette cléet pareil pour les sessions ici ou pour les schedules.Et ça va permettre de plus facilement typer ces informations,de pouvoir avoir l'autocomplétion égalementet de ne pas dépendre de ce dont on se souvient du nom des clés.
00:05:55 :On va pouvoir juste mettre un point et avoir l'autocomplétion de l'IDEqui va nous suggérer les champs qu'on a de disponibles sur ces data classes.
00:06:02 :Donc ça va être beaucoup plus facile à manipuler.Et pour finir ici, plutôt que le final data, donc ce dictionnaire là,on a bien ce export data qui pour l'instant est créé vide,mais vous allez voir que par la suite, un petit peu plus bas,j'imagine il va l'ajouter, voilà, final data.movies.
00:06:16 :Donc là, vous voyez, on retrouve bien cette syntaxe avec le pointplutôt que de faire entre crochet la chaîne de caractère moviesqui là encore est un peu plus dangereuseparce qu'on pourrait oublier le S à movies par exemplealors que là on va avoir l'autocomplétionet ça va être plus facile de voir ce qui est disponible.
00:06:31 :On ajoute chaque film dans cette liste de moviespuisque si je reviens dans le models ici,là on a bien une liste d'objets de type moviequi est donc la data class movie.
00:06:42 :Et à la fin, ici, on l'exporte.Alors là, il utilise le dunder dict.On pourrait également utiliser à la place de çaune fonction qui est disponible dans les data classesqui s'appelle asdict.
00:06:52 :Donc là, les deux devraient faire à peu près la même chosemais je vais vous montrer quand même avec le asdict.Et là, on retrouve la même chose avec de nouveau iciles crochets et le moviesversus le .movies qui est plus explicite
00:07:03 :et plus facile à trouver avec l'IDE.Donc je vais accepter tous les changements iciet je vais vous montrer,donc si je reviens dans les data classes ici,on peut importer également le asdictqui est une fonction qui nous permet de récupérerpar exemple ici, si je faisais,on va prendre par exemple session
00:07:21 :puisqu'il y a juste time et format qui sont des strings.Donc si je faisais ici un ifname égale main,je pourrais faire un session qui est égale à session,vous voyez avec un time et un format.
00:07:31 :Et ensuite pour transformer ça en dictionnaire,donc pour par exemple le sauvegardercomme on l'a fait dans l'autre fichier en JSON,je pourrais faire un print.session--dict comme ceci,
00:07:41 :ça va marcher si je sauvegarde et que j'exécute ce fichier.Vous voyez qu'on a bien la data classqui est représentée sous forme de dictionnairemais je peux aussi utiliser le asdict comme cecipour l'afficher également sous forme de dictionnaireet là on va avoir le même résultat.
00:07:55 :Donc quelle est la différence entre les deux ?Moi je préfère utiliser asdict parce qu'elle est vraiment faitepour convertir cet objet, donc ce data class,en représentation de cette data class en dictionnairepuisqu'il y a pas mal de choses qu'on peut faire.
00:08:06 :Ici par exemple on peut dire que certains champs vont être excluset le asdict va également uniquement transformerles champs qu'on a ici sur notre data class en dictionnaire,ce qui ne ferait pas le cas avec le dict.
00:08:18 :Par exemple ici si j'ajoute un nouveau champ,je peux dire par exemple .bonjour égale bonjour,comme ça on va faire un exemple tout bête,mais là si je fais un print session avec dunderdictversus le asdict vous allez voir qu'on aura une différencepuisqu'on a le premier qui a bien ajouté le champ qu'on avait en plus,
00:08:33 :donc le champ qu'on vient de rajouter ici,et l'autre qui ne l'a pas, qui va donc uniquement garderce qu'on avait défini dans la définition de notre data class.
00:08:40 :Donc à vous de voir ce que vous préférez,il y a aussi le fait que normalement,c'est pour ça que ça me surprend un petit peu qu'il est fait comme ça ici,on ne va pas avoir avec le dunderdict la conversion imbriquée,c'est à dire que là on a beaucoup de choses qui sont imbriquées,
00:08:52 :on a un export data qui contient des data class movie,le movie qui contient des schedules etc,comme on l'avait vu,et si je ne me trompe pas en fait,avec le dunderdict il ne va pas faire la conversiondes instances qui sont imbriquées les unes dans les autres.
00:09:04 :Donc là encore une bonne raison pour utiliser asdict à la place.Donc moi ici je vais le modifier,je vais retrouver où est-ce qu'il l'a fait ici,tout en bas,voilà il a fait le final data en dict,d'ailleurs on pourrait pour vérifier relancer notre script ici,donc si je limite pour ne pas le faire sur tous les films,
00:09:20 :on va mettre un slice de nouveau ici avec 2.1,là en fait je pense que c'est ce default ici avec le lambdaqui fait qu'il va automatiquement développer les dictionnairesqui sont en dessous,si j'enlève ce default ici,vous allez voir qu'on n'aura probablement pasune bonne représentation des données imbriquées,
00:09:37 :donc si je relance le script ici avec juste un film,voilà vous voyez on a effectivement une erreur,et là à partir des movies,il n'arrive plus à faire cette imbrication.
00:09:46 :Donc si je l'enlève,je vais supprimer ce fichier,si je remets comme on avait le default dict,je relance,je pense que cette fois-ci ça va fonctionner,ça a l'air effectivement,et là vous voyez qu'on a bien les instancesqui sont imbriquées,donc les data classes qui sont bien développées.
00:10:03 :Mais bon pour éviter de faire ça,on peut utiliser le as dict,encore une fois ça va être plus simple,ça va être plus clair,plutôt que de faire ce truc là iciqui fonctionne pour l'IAmais qui ne fonctionne pas vraimentpour la bonne lecture d'un humain.
00:10:14 :Donc ici on va remettre le as dictsur le final data,je sauvegarde,et je vais juste importer ici tout en hautdonc depuis data class,donc on va le faire ici,from data class,import as dict,et si je relance le script,normalement cette fois-ci,sans le default lambda,
00:10:31 :ça devrait marcher également,et on a bien effectivementtoutes les infos qui sont développéescorrectement ici.Donc je vais enlever mon slicequi était ici,et c'est tout bon pour cette partie,on a bien séparé nos modèlesdans un fichier séparé,ça je peux l'enlever aussiou le laisser si jamais on veut
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.