Session du 08 octobre 2024 à 21h00
Développement Web & Frameworks
Frontend & UI
DevOps & Environnement
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 "Office Hour" / Foire aux questions
Foire aux questions pour répondre à toutes vos questions sur Python, puis discussion sur la config de mes outils front-end pour Django.
00:05:51 :Le dossier .envs, c'est quoi ?En fait, c'est créé par défaut par cookiecutter.Je vais partager mon écran. On va se créer un projet Django avec cookiecutter.django et comme ça on aura devant nous exactement de quoi il s'agit.
00:06:13 :Je vais essayer de partager l'écran.J'en ai un que je peux partager si tu veux Thierry.C'est encore plus rapide comme ça je n'ai pas besoin de le créer. Je ne suis pas un fan de cookiecutter.django. J'ai mon propre cookiecutter parce que cookiecutter.django est très complexe mais vient aussi avec des choix de configuration qui lui est propre.
00:06:37 :De manière générale, ce n'est pas un template facile.Non, ce n'est pas facile.Par contre, c'est un excellent sujet d'étude.Je le recommande absolument pour étudier des configurations de production qui correspondent vraiment à ce qu'on ferait dans le monde professionnel où personne n'utilise quasiment jamais Django Admin Start Project par exemple.
00:07:06 :Ici, c'est une très bonne chose de l'étudier.Je partage mon écran.C'est à volonté. Comme ça, ça me permet aussi de voir si ça fonctionne.
00:07:18 :Je vais sélectionner une fenêtre d'un écran. Il faut que je sélectionne l'écran entier.Est-ce que vous voyez quelque chose ?En tout cas, c'est en train d'arriver.
00:07:29 :Moi, je vois et je pense que les autres aussi mais si quelqu'un nous donne aussi sa confirmation, ce serait parfait.C'est pas encore pour moi mais c'est peut-être ma connexion.
00:07:42 :Oui, chez moi, ça a mis quelques secondes à arriver et ça dépend de la connexion de chacun, j'imagine.Sinon, je peux retenter le partage.Est-ce que là, vous voyez par exemple que je déploie un dossier ?
00:08:01 :Oui, ça va chez moi. Moi, je vois.Chez moi, Seb, c'est bon. Et puis apparemment, c'est Artel aussi.Le projet que j'ai créé, c'est son nom.
00:08:12 :Oui.J'ai créé un environnement virtuel. C'est moi qui l'ai créé dedans.Ce que Cookie Cutter Django a généré, c'est tout ce fichier-là.C'est moi qui l'ai rebaptisé SRC parce que sinon, ça faisait doublon avec un autre dossier qui est là parce qu'il utilisait le même nom.
00:08:37 :Il a généré tout ça.J'ai juste rajouté ce fichier-là .env parce que c'est ce qu'il conseillait dans la documentation.Mais sinon, celui-là, le dossier .envs, il y était déjà.
00:08:51 :Ce dossier .envs, en fait, il n'est pas toujours utilisé.Ça dépend comment tu utilises Cookie Cutter Django.Cookie Cutter Django génère tous les fichiers de configuration, y compris pour Docker.
00:09:10 :Il utilise un outil qui s'appelle Docker que tu connais peut-être ou que tu ne connais peut-être pas en fonction de ton parcours pour l'instant.J'en ai entendu parler. J'ai cliqué sur le truc pour que ça l'installe parce que je sais que j'en aurai besoin pour le projet.
00:09:23 :Je ne sais pas du tout m'en servir pour le moment.En fait, Docker, ce qu'il fait, c'est que sur ton ordinateur, quand tu veux faire tourner un projet Django un peu avancé,tu as un certain nombre de serveurs à faire tourner.
00:09:37 :Tu as Run Server, donc le serveur de développement de Python et de Django, en l'occurrence.Et puis, tu as le serveur de base de données.
00:09:46 :Mettons que tu utilises PostgreSQL, tu as ce serveur-là à utiliser.Peut que tu utilises également des systèmes de cache, par exemple, pour gérer la performance de rendu de ton front-end.
00:10:01 :Et puis, il y a différents endroits aussi, quand on fait des requêtes, des requêtes complexes qui prennent du temps,on voudrait mettre en cache le résultat pour éviter de devoir refaire cette recherche souvent.
00:10:11 :Par exemple, on peut le mettre en cache.Il y a un système de cache dans Django qui utilise une autre base de données, par exemple, typiquement Redis.
00:10:21 :Et Redis, c'est simplement un autre serveur.Donc, si à la main, tu dois installer ces différents serveurs, et après tu dois penser au début du projet à lancer Run Server,lancer PostgreSQL, lancer Redis, lancer un robot de choses.
00:10:37 :Finalement, tu as trois quarts d'heure de démarrage au début de la journée de ton projet.Et Docker te permet d'orchestrer tout ça.Si tu veux, tu crées un script.
00:10:50 :Et puis, dans le script, tu déclares quels sont les outils dont tu as besoin.Tous les différents serveurs, j'ai besoin de PostgreSQL, j'ai besoin de Redis, etc.
00:10:58 :Et puis, ça va les installer automatiquement sur l'ordinateur si tu ne les as pas déjà.Ça va les faire démarrer quand tu demandes de démarrer.
00:11:05 :Et puis, ça va configurer le tout pour qu'ils communiquent entre eux.Et justement, pour configurer ce tout, il faut, en outil pratique, en tout cas, c'est des variables d'environnement également.
00:11:17 :Donc, dans ce ANS, pour pluriel, tu as ces différentes variables d'environnement.Si on va regarder dans locales, par exemple, tu as Django et PostgreSQL.Donc, si on va regarder maintenant dans Django, par exemple, dans Django, tu as certaines variables d'environnement,comme par exemple Redis URL, qui dit sur quelle URL Django va trouver la base de données Redis,
00:11:39 :qui est utilisée pour plusieurs choses.Première chose, pour le serveur de cache, comme moi, ça dit.Deuxième chose, pour un outil qui s'appelle Celri.Celri, c'est un gestionnaire, enfin, une fiche d'attente de tâches pour des tâches qu'on ne pourrait pas faire dans une vue Django, par exemple.
00:11:58 :Imagine que tu fais une requête à ton application, et puis, cette application va faire un traitement lourd sur un fichier.Elle ne pourra pas simplement le faire dans une vue, et donc, le navigateur ne pourra pas attendre que le traitement soit terminé.
00:12:12 :Alors, qu'est-ce qui va se faire?On a notre navigateur qui va demander quelque chose à la vue.La vue va entamer ou commencer ce traitement lourd, mais elle ne va pas directement faire ce traitement lourd.
00:12:24 :Elle va faire ça comme une tâche de fond.En fait, elle va demander à cet outil Celri d'accomplir le plus vite possible, quand il pourra, cette tâche-là.
00:12:33 :Et puis après, du coup, on va redonner la main au navigateur, et puis la tâche va se faire de manière asynchrone.Ça, c'est l'idée.Et Celri, justement, utilise aussi ce serveur Redis.
00:12:43 :Et donc, du coup, on a besoin d'indiquer à Django quelle est l'URL où il va trouver Redis.Et du coup, on a une variable d'environnement RedisURL.
00:12:51 :Même chose, on a besoin de dire à Django où il va trouver la base de données,et respectivement dire à PostgreSQL quelques informations, comme par exemple le nom de la base de données qu'il va utiliser, le nom d'utilisateur, etc.
00:13:04 :Et ici, par exemple, on a les variables qui vont être envoyées à PostgreSQL pour qu'ils configurent le nom de l'utilisateur, le nom de l'host.Donc, Django va trouver PostgreSQL sur l'hôte PostgreSQL, sur le port 4532.
00:13:20 :Ici, le nom de la base de données, ça s'appellera arimaï, qui est le nom de ton projet.Et puis, il a créé un user pour ça, avec un nom assez long.
00:13:28 :Alors, en fait, moi, je vais indiquer un user, et je m'aperçois qu'il l'a crypté.Pareil, le mot de passe.Il m'a demandé un mot de passe, et il l'a crypté.
00:13:40 :C'est pour ça que je me demandais si dans les variables d'environnement qu'on indiquait,il ne fallait pas justement trouver un système de cryptage, puisque je me suis aperçu que là, elles étaient cryptées.
00:13:48 :Alors là, personnellement, moi, je ne l'ai jamais fait.Surtout pas, finalement, pour les variables locales.En plus, moi, en général, pour le développement, donc en local,je ne mets pas des variables d'environnement qui sont très sensibles.
00:14:08 :Malgré tout, ce répertoire ANS, sauf erreur, dans Kikuito Django,il est versionné et envoyé sur GitHub.Je peux me tromper.En tout cas, pour les variables locales et pour la production, on doit les changer.
00:14:25 :En général, ce qu'on va faire, c'est qu'on va changer les variables d'environnement sur l'environnement.Il est dans le Gitignor, donc ils ne seront pas versionnés.
00:14:33 :Oui, il est dans le Gitignor, effectivement.À partir du moment où il n'est pas versionné, ce qui est du risque, c'est qu'évidemment,tu bosses sur ton poste, et puis tu te lèves pour aller aux toilettes,et puis quelqu'un vient te regarder son poste.
00:14:47 :C'est le type de risque, donc à toi de l'évaluer en fonction de l'endroit où tu développes.Le cas échéant, c'est possible de chiffrer ces données,et puis dans ce cas, quand on va lire ces données, on peut les déchiffrer.
00:15:01 :Il y a toujours possibilité de chiffrer, de déchiffrer,toujours des villes que je n'ai pas forcément personnellement été dans,dans des environnements où, en tout cas pour les variables locales,je devais les déchiffrer, par contre, c'est des variables de développement,je leur donne clairement des noms qui ne sont pas les mêmes noms que j'aurais en production,
00:15:22 :et donc j'ai aucune possibilité de fuite de données.Quand tu développes, moi, la plupart du temps,quand je développe, le nom de ma base de données, c'est le nom de mon projet,le nom de l'utilisateur, c'est le nom de mon projet,le nom du mot de passe, c'est le nom de mon projet,
00:15:36 :donc en développement, il n'y a aucun secret qui fuite,et puis finalement, la base logale de développement,c'est une base temporaire qui est juste dédiée au développement,qui n'est pas exposée sur le web, etc.
00:15:54 :À mon avis, ça ne pose pas de problème sensible à aucun niveau.OK. Merci beaucoup pour cette note-là.En tout cas, dans cette partie-là, on est sur Docker,et dans le .env, on est directement dans la configuration de ton application Django.
00:16:10 :En fait, le .envs n'est pas censé le toucher, on va dire, à la base.C'est généré automatiquement par Cookiecutter Django,et le .env, lui, va être chargé dans le base .py des settings de Django,
00:16:24 :et puis ces variables d'environnement vont être lues après.Donc, par exemple, si on va dans config settings base,donc ça, c'est peut-être le fichier qui va le plus parler aux autres qui font déjà du Django, éventuellement.
00:16:42 :Ça, c'est le settings.py que vous avez l'habitude de voir.Si on va tout en haut, un petit peu plus bas,normalement, on doit voir quelque part, probablement qu'il l'a mis là,mais peut-être ailleurs, on a le debug, par exemple.
00:16:55 :Donc là, on peut décider si on veut travailler en mode debug ou pas.Dans le local.py, on aura la secret key, par exemple,qu'on pourra éventuellement définir à sa sauce.
00:17:07 :Si on remonte tout en haut,on a la secret key qu'on peut définir dans cette variable d'environnementpour donner une secret key qu'on voudrait.On voit que par défaut, il y a une erreur,mais qu'on peut définir une variable Django secret key dans le .env
00:17:23 :si on veut donner notre propre variable.Et puis, on retrouve la même chose à différents endroits de la configuration.Soit on accepte la configuration par défaut,soit on a des endroits, comme ici la secret key,mais comme ailleurs également, où on voit qu'on a un nomqu'on peut noter, qu'on peut aller utiliser dans le .env
00:17:42 :pour donner sa propre valeur si nécessaire.Ça évite que tu doives modifier directement ce fichier.OK. Super.Merci beaucoup. J'y vois un peu plus clair.
00:17:54 :Je t'en prie.Et donc là, le Docker, il est déjà déployé à ce stade-là, c'est ça ?Le Docker, il est déjà configuré.Tu as tous les fichiers de configuration dans le répertoire Compose.
00:18:07 :OK.Et puis, dans le fichier local.yml qui est à la racine,il y a deux fichiers.Il y a local.yml et puis production.yml à la racine de ton projet
00:18:19 :qui sont les fichiers Docker Compose.Et puis ensuite, ces fichiers-là vont faire...Alors maintenant, ils ont changé dans les Docker Compose.local.yml.Ce fichier-là va faire appel à des fichiers de configuration Dockerqui sont dans le répertoire Compose.
00:18:36 :Elle est assez intéressante.J'en apprends en Docker.Pour ceux d'entre vous qui apprennent Docker,ce projet-là nous montre comment dockeriserune application Django de manière professionnelle.
00:18:51 :C'est un peu touffu, mais une fois, si ça intéresse des gens,on peut se faire une session pour vraiment aller en détaildans cette configuration Docker si nécessaire.
00:19:02 :OK.Mais ça va vraiment intéresser vraiment ceux qui font du Djangoet ceux qui font du Django à objectif professionnel.Donc, probablement pas ceux qui passent, par exemple,pas actuellement le TOSA, par exemple,qui sont vraiment intéressés sur du Python pur.
00:19:18 :Mais ici, effectivement, si on veut voir une fois un projet Djangoavec une config pro, puis l'étudier, c'est une bonne config pour ça.Très bien. Merci.
00:19:34 :Alors ?Oui, oui.Euh, bon.Je... bon.Euh, Cookie Cutter, là, j'aimerais bien savoir c'est quoi.C'est...Alors ?C'est comme le setting de Django, ou bien on le met avec Django,ou c'est quoi son...
00:19:58 :Alors, Cookie Cutter, en fait, c'est un outil Pythonqui permet de créer des templates de projet.Alors, qu'est-ce qu'un template de projet, en fait ?
00:20:08 :Tu vois qu'au début de chacun de tes projets,tu as des fichiers à créer.Typiquement, Django Admin Start Project,le nom du projet, quelque chose,il va te générer le squelette dans un nouveau projet Django, par exemple.
00:20:24 :Mais pour n'importe quel projet, même si c'est un projet Python,tu as besoin de générer une sorte de squelette de projet.Et Cookie Cutter te permet d'automatiser tout ça.
00:20:35 :Par exemple,si je prends un exemple d'un Cookie Cutterque j'ai préparé pour moi-même, par exemple.Alors, je ne sais pas si vous voyez mon écran.
00:20:48 :Ici, pour un étudiant, moi,j'avais créé, par exemple, un Cookie Cutterqui génère des configurations.Alors ça, c'est pour Django, mais tu peux générer n'importe quoi, en fait.
00:21:03 :Alors, si on prend, justement,je suis complètement planté dans l'ouverture de mon projet.Des jours, particulièrement le soir,j'ai de la peine à faire deux choses en même temps,parler et réfléchir.
00:21:17 :Mais, voilà.Alors, mon Thora doit en avoir un, deux, trois.C'est bon.Et là, par exemple,il y a deux phases à Cookie Cutter.C'est-à-dire, utiliser Cookie Cutter.
00:21:33 :OK.Donc, si on veut utiliser Cookie Cutter,c'est relativement simple.On va simplement, par exemple, installer l'outilCookie Cutter sur son ordinateur en global.Et à partir du moment où j'aurai installé Cookie Cutter,c'est un outil que je peux installer.
00:21:48 :Donc, Cookie Cutter, par exemple.Cookie Cutter.Et, tout de suite,je peux lui demander d'utiliser un templatepour me générer un projet.Alors, celui qui est déjà utilisé,c'était Simon, c'est ça ?
00:22:04 :A utilisé tout à l'heure,c'est un template qui s'appelleCookie Cutter slash Cookie Cutter Django.OK.Si j'exécute cette commande,il va me créer un nouveau projet Djangoen me posant plein de questions.
00:22:21 :Il y a 27 questions.Voilà.Il va me dire quel est ton nouveau projet.Mon projet s'appelle Montaura, par exemple.Du coup, il va me proposer une sorte de slug.
00:22:32 :Puis, il va me demander une description.Une petite description de mon projet.De mon projet, etc., etc.Puis, tu vas répondre à toutes les questions.
00:22:44 :Pour ne pas aller au bout des 27 questions,on va prendre un autre Cookie Cutter.Ici, à moi, par exemple, Cookie Cutter.Cookie Cutter.Et puis, sur mon GitHub,Place Python, par exemple,j'ai un Cookie Cutter qui s'appelle Django Settings.
00:23:01 :En français, par exemple.Alors là, il va me demanderquel est le nom de mon projet.Alors, nouveau, mon projet,on va dire qu'il s'appelle Montaura.
00:23:11 :Alors, Montaura.OK.Dans quel répertoire se trouve mon WSGI.py ?On est sur un projet Django.Il se trouve dans le config.Quel est mon nom ?
00:23:23 :Je l'ai configuré pour moi.L'avantage, c'est qu'il me propose mon nom directement.Mais, on peut varier tout ça.Quel est le modèle utilisateur que j'utilise ?
00:23:33 :Etc., etc.Et puis, à la fin, est-ce que j'utilise Wagtail ?Ou des trucs comme ça.Là, j'utilise, par exemple, Wagtail.Il m'a généré, finalement,mes settings Django automatiquementen fonction des questions qu'il m'a posées.
00:23:50 :C'est moi qui ai pu configurer tout ça.Et donc, ça te permet de créer rapidementplusieurs fichiers des squelettes de projets entiersavec, ici, tous mes settings commentés, etc.
00:24:05 :Donc, Cookie Cutter, c'est un outilqui te permet de créer des templatesqui, ensuite, pourront être générés facilementà l'aide d'une commande.Et ici, cette commande que j'ai utilisée,c'est simplement Cookie Cutter.
00:24:19 :Donc, pour utiliser Cookie Cutter,que ce soit mes propres Cookie Cutterou que ce soit ceux, par exemple,de Cookie Cutter Django,je n'ai pas besoin d'apprendre Cookie Cutter.
00:24:32 :J'ai besoin d'installer Cookie Cutteret puis, ensuite, de pouvoir l'utiliser.Et puis, je peux créer mes propres templates.Alors, les templates Cookie Cutter,c'est simplement des projets GitHub.
00:24:42 :Alors, si je m'ouvre en navigateur,c'est simplement des projets GitHub.Alors, si je vais sur GitHub,et puis, que je vais sur un repodans un template Cookie Cutter,celui qu'on a vu avant,c'est simplement un repo comme celui-làoù on a un Cookie Cutter pour un gisson.
00:25:13 :Ça, c'est toutes les questionsqu'il va pouvoir poser à l'utilisateur.Et ensuite, vous voyez,finalement, Cookie Cutter nous proposede générer des fichiers.Et puis, il me propose de générer des fichiers,mais je peux utiliser une notationqui est similaire à celle de Djangopour personnaliser les fichiers.
00:25:37 :Si je vais dans ce fichier-là, par exemple,on va y trouver ici une condition.Alors, si vous faites du Django,vous avez déjà vu ce genre de choses.
00:25:45 :Ce n'est pas du Django directement,c'est du Jinja 2,mais on est très proche de Django,avec Jinja.Et ici, je peux dire,voilà, si vous voulez installer,utiliser Wagtail,alors dans ce cas-là,ce qui est entre ce IF et ce ENIFva être ajouté ici dans Installed App.
00:26:02 :Et puis, je peux scripter,finalement,l'écriture de mon projet.Et donc, si tu as des projets Python,et que tu vois qu'à chaque foisque tu commences un nouveau projet,tu es toujours en train de faire la même chose,tu es toujours en train de créer en README,tu es toujours en train de créer en Gitignore,
00:26:20 :et puis après, tu es toujours en train de créeren répertoire de projet principal,et puis à l'intérieur de ce projet,tu es toujours en train de créeren fichier init.py, par exemple,
00:26:29 :etc.Et que tu n'as pas envie,enfin, ça commence à t'agacerde devoir faire ça à chaque début de projet.Bah, par exemple,cet outil Cookie Cutterte permet de te créer une fois un projetqui correspond exactement à ce que tu veux,et puis générer ce projet automatiquement après,
00:26:47 :sans avoir besoin de te prendre la têteavec toute la configuration.Et puis, comme a fait Simon,le template que lui,il a utilisé pour générer son projets'appelle Cookie Cutter Django.
00:27:00 :Il se trouve également sur GitHub.Donc, on peut étudier toute la configuration ici.Et ce template,c'est un template assez tout cul.Il y a du bien, il y a du moins bien,mais toujours est-il qu'il permet de générertrès rapidement un nouveau projet Djangoen suivant les bonnes pratiques
00:27:19 :qui ont fait les auteurs de ce template.C'est l'auteur de Tous Cooks Django,qui est un des livres les plus connussur les bonnes pratiques Django.
00:27:28 :Donc, Daniel Roy Greenfieldsont des experts du domaine.Et dans ce template,ils ont réuni un grand nombrede bonnes pratiques Django.Presque trop, d'ailleurs.
00:27:46 :À mon avis, je le trouve un petit peu trop lourd.Et justement,qui ne laisse pas assez de flexibilitésur certaines choses,comme par exemple les outils front-end.
00:27:54 :Mais globalement,ils ont réuni des bonnes pratiques.Et comment est-ce qu'ils ont fait ?Finalement, ils ont juste créé un projetCookie Cutter là.Et puis, n'importe qui peut maintenantvenir l'installer, ce projet,et puis se créer un projetavec cet outil Cookie Cutter.
00:28:10 :Comme je vous l'ai montré avant,si vous voulez tester Cookie Cutter Django,c'est qu'une commande.Et cette commande, c'était...Cette commande, c'était donc Cookie Cutter.
00:28:27 :Et puis, je vous encourage simplement à essayergithub.com cookiecutter.comslash cookiecutter django.Voilà.Et puis après, vous laissez guiderpar l'outil qui va vous générer votre projet.
00:28:42 :En fait, c'est la même chose que de faireen django-admin-startprojectle nom de votre projet.Donc django-admin-startproject.Ça, si vous faites du Django,vous avez déjà fait ça nombreuses fois,nom du projet, donc nom de projet.
00:29:00 :Et voilà.Simplement, le template qui va être généré làest assez simpliste,tandis que celui qui est généréavec Cookie Cutter Django,c'est déjà quelque chose que vous pouvez utilisersur des projets pro.
00:29:12 :Voilà.Donc, de nouveau, excellent sujet d'étude,mais peut-être un peu complexe.Et donc, ça peut éventuellement faire naîtreplus de questions que ça a résolule problème.
00:29:25 :Ça, c'est peut-être un des soucis au départavec ce genre d'outils,c'est qu'il ne faut pas forcément brûler troples étapes, au tout début en tout cas.
00:29:34 :Et donc, si ça génère plus de questionsqu'autre chose, n'hésitez pas, par exemple,ne serait-ce qu'à me contacter sur le Discordde Docstring, et puis on en parle,on parle de vos questions.
00:29:45 :Et ce Discord est fait pour ça.D'accord.Si je comprends bien,au fait, il y a des templates déjà disponiblessur GitHub pour Cookie Cutter.
00:29:57 :Oui.Et là, tu peux aller choisir le templateque tu veux, et tu démarres ton projetavec ce template.Voilà.Qui a plus de contenu que le template de Django.
00:30:10 :Voilà.Et ça, c'est un template officiel,mais en fait, tu as plein d'autres templates.Si tu veux faire du React avec Django,par exemple, tu vas trouver des templatespour un projet React avec Django.
00:30:21 :Si tu veux, si tu fais pas du Django,mais du Fast API, par exemple,tu trouveras des templates Fast APIqui te configureront ton projet.
00:30:30 :Si tu fais pas du web,mais que tu fais du Python classiqueou une interface graphique avec PySide,par exemple, tu trouves des templatespour des projets PySide, etc.
00:30:42 :Donc, ici, pour tout type de projet Python,tu peux trouver un template déjà faitqui t'aidera à démarrer,ou alors tu peux faire ton propre templatequi t'aidera à démarrer tes futurs projets,ou alors tu peux prendre un templateque tu trouves sur le webet le modifier à ta propre source
00:30:59 :et puis ensuite l'utiliser pour toi-même.Donc ça, c'est très flexible.C'est relativement facile d'accès.J'avais fait une fois un webinaire pour Sam,peut-être que j'en referai à l'occasion,pour apprendre à faire ses propres cookie cutters.
00:31:12 :Mais en tout cas,pour savoir utiliser le template des autres,t'as pas vraiment besoin d'une formation de trois jours,t'as besoin de dix secondesà aller lire la doc de cookie cutter,de l'installer sur ton ordinateuret après tu peux utiliser les templates de projetdisponibles sur le web.
00:31:29 :Merci.En ce qui me concerne,ça a été un peu plus que dix secondes quand mêmede lire la doc et d'installerparce qu'en fait, au fur et à mesure,en fait déjà, il y a des prérequis.
00:31:45 :Par exemple, il fallait que PostgreSQL soit bien installé correctement.Il fallait que Celery soit bien installé.Donc ça, c'est des prérequis qui te signalent dans la documentation.
00:31:53 :Mais il y a aussi des choses qui ne te signalent pas.C'est que par exemple,je me suis aperçu en essayant de chargerles modules qui sont dans Requirementsqu'il y en avait un qui ne pouvait pas lires'il n'y avait pas un outil pour lire le C++ sur mon ordinateur.
00:32:09 :Donc j'ai dû installer un truc qui s'appelle,moi je suis sous Windows,qui s'appelle Microsoft Visual Studiopour qu'il puisse lire le C++pour installer les modulesqui étaient dans Requirements.
00:32:24 :Donc ça peut quand même être un peu complexe.Ça peut prendre un peu de tempspour s'approprier le truc quand même.Après, ça dépend de nouveau celui que tu as installé.
00:32:37 :Pour Cookie Cutter Django.Les Requirements de Dev dans Cookie Cutter Djangone devraient pas avoir besoin normalementd'un compilateur pour installer les choses.Par contre, les Requirements de production,eux, ils ont besoin effectivementd'un compilateur pour le driver PostgreSQL.
00:32:56 :Et là, ça complique tout de suite.Si on est sur Windows,si on est sur Mac et Linux,c'est déjà un petit peu plus simple.
00:33:05 :Mais quand je parlais de 10 secondes,c'était pour utiliser Cookie Cutter.Pour utiliser Cookie Cutter Django,évidemment, il faut déjà lire leur doc,qui est conséquente.
00:33:13 :Et puis, le problème peut-être,c'est qu'effectivement, ça installe plein d'outils.Et il faut déjà avoir entendu parler de ces outils,voire savoir les utiliserpour pouvoir réellement tirer profit de cet outil.
00:33:28 :Déjà, pour répondre aux 27 questions qui sont posées,il faut comprendre les questions.Souvent, on a des questions qui sont poséeset puis des choix qu'on peut fairequi sont incompatibles les uns avec les autres.
00:33:43 :Et on le sait qu'après la 27e question.Donc, ça implique quand même qu'on comprenneun petit peu ce qu'on fait quand on le fait.Il y a Yanis qui a une question.
00:33:59 :Oui, bonsoir Thierry.Alors, question qui n'a un peu rien à voir avec Django,mais j'ai voulu voir un peu plus en détailce qui se passe avec le constructeur Newqui est appelé avec init en arrière-plan.
00:34:13 :Et dans le code que...Alors, il y a le micro qui a flanché,donc je vois les codes qu'ils ont postés.Ah pardon. Dans le code que je mets dans le chat,
00:34:28 :je ne vois pas à quoi peuvent référer CLS,ARGS et QUARGS explicitement dans cet exemple-là.Par rapport à New.Alors, déjà, ils ne sont pas forcément nécessaires.
00:34:43 :En fait, techniquement, New va prendreles mêmes arguments ici que init.Par contre, il ne va pas forcément utiliser ces arguments.Alors, peut-être que je vais prendre en exemple.
00:35:00 :C'est possible d'avoir un exemple un peu plus explicite,un peu plus simple.Alors, il faut que j'aille dans mon...Là, j'ai un Chrome de docstring,et puis, du coup, je n'ai pas mon compte Google là-dessus.
00:35:17 :Est-ce que vous voyez le bon écran ?Donc, New, c'est une méthode statique.C'est peut-être la seule situationoù on utilise réellement une méthode statique en Python.
00:35:43 :Mais donc, ici, pour ceux qui savent,parce que c'est New, en fait,en Python, on a le init.Tout le monde qui a commencé à utiliser des classesa, en principe, vu ce qu'est le init dans une classe.
00:36:02 :Donc, techniquement, on parle de constructeur pour init,mais ce n'est pas vraiment constructeur.On peut dire qu'on est dans la méthode d'initialisation.Mais finalement, c'est en constructeur,parce que c'est d'initialisation.
00:36:17 :Donc, ça, c'est une première méthode qui est appelée.Par contre, il y a une autre méthode qui existe ici,qui est une méthode qui s'appelle New.
00:36:25 :C'est une méthode statiquequi va prendre comme premier argument une classe, par exemple.Mais si init n'a pas d'argument,normalement, New devrait pouvoir ne pas en avoir.
00:36:37 :Donc, on peut, ici,et voilà.Donc, on peut définir New comme ça.Maintenant, si on teste,on essaie d'instancier un objet,donc ici, un objet,ça s'obtient simplement en allant instancier une classe.
00:36:57 :A priori, on voit que, effectivement,quand j'instancie un objet,quand je crée un objet en instantiant cette classe, ma classe,en fait, il y a deux méthodes qui sont exécutées en Python.
00:37:10 :Il y a New et il y a init.Maintenant, New est responsable,on voit que New fait un return, en fait,parce qu'il retourne le nouvel objet,et ensuite, init l'initialise.
00:37:27 :Qu'est-ce qui se passe dans les faits, en fait, quand je fais ça ?Quand je fais ça, c'est l'équivalentde d'abord appeler New,récupérer la nouvelle instance qui a fabriqué New,puis ensuite appeler init sur cette nouvelle instance.
00:37:42 :Donc, par exemple,si ça, ce serait l'équivalent,ce n'est pas forcément ce qu'on fait,mais on pourrait le faire à la main, par exemple.Donc, c'est ma classe,ma classe.new,
00:37:57 :ma classe.Ça, ça crée le nouvel objet.Donc là, on a bien appelé New,et puis on a bien l'objet qui est créé.D'ailleurs, si je fais en objet,en objet a bien été créé.
00:38:14 :On a une instance qui a été créée,et puis ensuite, on peut appeler sur cet objet,on peut appeler init,on doit repasser l'objet ici,en object, init.
00:38:29 :Non, on ne doit pas le repasser.Autant pour moi.Ou, dit autrement, c'est ma classe,init, en objet.Donc ça, c'est si je décomposece qui se passe au niveau de Python.
00:38:45 :On fait l'équivalent, mais finalement,on n'a pas envie, chaque fois qu'on crée un objet,on n'a pas envie de faire deux appels comme ici.Donc en fait, ça,c'est l'équivalent strict de ces deux lignes.
00:38:59 :Et donc, on a le new qui est appelé.Donc ça, c'est un détail d'implémentation.Quand on apprend Python,on n'a pas forcément besoin de savoir que ça, ça fait ça.
00:39:09 :Mais si on a besoin, parfois, d'utiliser new,et qu'on a un init, par exemple, ici.Je ne sais pas, non, par exemple.Si je crée une classe personne, par exemple.
00:39:22 :Personne, et donc là, il y a un non.Et puis, je vais me créer un attribut,self, non, également.Par exemple.Et que je réessaye maintenantde me créer une classe personne, ici.
00:39:39 :Où je passe un non.En fait, on va voir qui me pose problème.Parce que init prend un non.Donc, je vais passer un non pour vouloir créer mon objet personne.
00:39:52 :Mais, ici, new va recevoir, ici, comme argument,en fait, exactement les mêmes argumentsqui sont passés à init.Donc, ici, comme j'ai mis un argument Thierry,ce Thierry va être passé au paramètre non, ici.
00:40:10 :Et puis, du coup, quand j'appelle ça,il va essayer aussi de passer Thierry en argument, ici.Si j'utilisais non, ici, quelque part,dans cette méthode init, et new, là,je pourrais, ici, mettre non.
00:40:27 :Je peux le mettre, et maintenant, ça fonctionne.Mon code fonctionne, en principe.Les deux méthodes, les deux constructeurs, si on veut,ont la même interface, sauf que new, il a en classe,et puis non, et puis init, il a self, et puis non.
00:40:45 :Et donc, ici, si maintenant je rajoute un prénom,simplement pour avoir un prénom,de nouveau, ça va coincer.Ça va coincer quand je vais ajouter.
00:41:03 :Alors, on va plutôt faire le contraire,rajouter mon prénom, ici.Ça va coincer parce que, du coup,j'ai deux paramètres, ici.Donc, je passe deux arguments.
00:41:18 :Ces deux arguments sont aussi passés ici.Donc, je dois aussi rajouter prénom, ici.Mais, selon ce que je fais dans ce new,si je ne veux pas ça, je vais capturertous les arguments qui seront envoyésavec cette notation étoile-axe.
00:41:37 :Alors, ceux qui ont déjà un petit peu vuce qu'était cette étoile, c'est une manière, en Python,d'accepter un nombre indéterminé,et a priori infini, mais indéterminé d'arguments.
00:41:50 :Donc, ici, du coup, je vais passermon nom et mon prénom.Ces noms et ce prénom vont être passéségalement à new, et puis, donc,ils vont être capturés par ce axe-làqui est capable de capturer un nombred'arguments de longueur indéfinie.
00:42:08 :Mais donc, du coup, ça va fonctionnerquel que soit le nombre d'arguments.Maintenant, si j'ajoutais l'âge, ici,celle.âge égale âge,ce ne serait plus un problème,je n'ai plus qu'à ajouter mon âge,20 ans, pas 10, mais...
00:42:28 :Et ça continue à fonctionner.Ici, ce axe, il accepte un nombreindéfini de paramètres, d'ailleurs,on peut voir ici, si on met une stringavec new, avec axe,on voit que, finalement, axe,ça va être un tuple qui contienttoutes les valeurs, théorie, chapeau,théorie, vente, ici, qui ont été envoyées
00:42:52 :à new, voilà.Donc, pour ceux qui ne comprennent pasle rôle de new, en fait, newfabrique l'objet.Donc, quand on appelle ici la classepersonne et qu'on l'exécute en luienvoyant des arguments, il va y avoird'abord la fabrication d'un objet,et ensuite init sert à initialisercet objet.
00:43:13 :La plupart du temps, on n'a pas besoinde cette méthode new, mais parfois,ça peut être utile.Un des exemples concrets où ça peutêtre utile, c'est pour ceux qui fontun petit peu de programmation objetet qui font ce qu'on appelle desdesign patterns, par exemple,et qui étudient les design patterns.
00:43:34 :Par exemple, parfois, on veut...Alors, par exemple, ça peut se faireavec une classe qui s'appelleraitdatabase, par exemple, base de données.Database.Et puis là, on pourrait avoir desinfos de connexion.
00:43:53 :Donc, ici, je peux mettre database,URL, par exemple.Des infos de connexion.Parfois, dans une base de données,on veut créer un seul objet qui seconnecte à la base de données.
00:44:05 :Pas mille, mais un.Et ici, de manière générale,si je décide de créer une connexionà ma base de données et que j'exécutema classe database en lui donnantune valeur pour notre database URL ici,il va me créer un objet.
00:44:26 :Systématiquement, il va me créerun nouvel objet.Puis si je réexécute ça une deuxième foisen objet 2, il va me recréer un nouvel objet.
00:44:37 :Et puis, etc., il va me recréer untroisième objet.Si je veux créer ce qu'on appelle unsingleton ou un singleton, par exemple,ce serait, ici, j'aimerais bien quecette base de données, elle ne créequ'un objet.
00:44:52 :Et s'il existe déjà, par exemple,qu'elle retourne toujours le même objetet pas à chaque fois un nouvel objet.Donc là, il y a, par exemple, despossibilités d'utiliser la méthode newpour ce genre de choses.
00:45:05 :Pour contrôler, on va aller enregistrerla nouvelle instance quelque part.Et si elle existe déjà, alors à cemoment-là, on va créer le nouvel objet.
00:45:14 :Par exemple, ici, je peux me créerune variable de classe qui s'appelleinstance égale none, par exemple.Et puis, pour le coup, vive l'IA.Je me crée en new.
00:45:30 :Typiquement, ça, ce serait une manièrehorrible en Python de créer un singleton.Il y a beaucoup plus simple, maiscertaines personnes qui veulent montrercomment fonctionne new font comme ça.
00:45:49 :Donc si on a déjà créé une instance,si on n'a pas créé d'instance,donc ça, ça vaudra none.Et du coup, on en crée une.
00:45:57 :Sinon, on renvoie à l'instance quiexiste déjà, par exemple.Donc en fait, avec ce mécanisme-là,on va altérer un petit peu le mécanismede création des différents objetsdu type database, par exemple.
00:46:11 :Donc c'est que dans des cas trèsparticuliers où on doit utiliser new,ou alors si on fait de lamétaprogrammation, on utilise desmétaclasses, ou là, on utilise plusfréquemment new.
00:46:22 :Donc la question de Yannis, c'estvraiment un petit peu plus spécialiséà ce niveau-là.Je doute même qu'on arrive sur cegenre de choses, mais ça peutéventuellement arriver.
00:46:32 :J'étudie une fois les questions dutout ça.Mais l'idée, c'est que dans laconstruction d'un objet en Python,en fait, il y a deux méthodes quisont impliquées.
00:46:43 :New et init.New crée le nouvel objet et initinitialise le nouvel objet.Et dans new, on a besoin d'avoirles mêmes nombres d'arguments quedans init.
00:46:57 :Et pour le coup, si on n'a pasenvie de chaque fois les écrire àun, pour synchroniser les deux, onpeut utiliser le étoile-axe et leétoile-étoile-quarks pour accepterun nombre indéfini d'arguments qu'onne va peut-être pas utiliser danscette méthode new.
00:47:14 :Donc ici, c'est pour recevoirsimplement des arguments qu'on neva pas utiliser.Et puis, je ne sais pas ce que tufais de spécifique dans ta méthode,mais c'est la raison pour laquellemoi, dans ce contexte, j'utiliseraices arguments-là.
00:47:29 :Donc, si je regarde le code que tuas posté sur les commentaires,typiquement, on a une méthode newqui ne fait rien à part afficher dutexte.
00:47:39 :Je pense avoir bien compris maintenantle code.Et donc, le superbe dans le new,c'est quelle classe parent ici ?Alors, typiquement, dans le new, c'estla classe parent object, puisque touteclasse, en fait, qui ne mentionne pasde parent, en fait, hérite d'objet.
00:48:03 :En fait, ce n'est pas vrai ce que jedis.Toute classe normale qui hérite derien du tout hérite d'objet.Et les métaclasses hériteront de type.
00:48:12 :Mais ici, donc, s'il n'y a rien quiest écrit à côté de voiture, en fait,tu pourrais avoir une parenthèse oùtu as object.Tu vois des fois, tu trouves de vieuxcodes sur le web où on hériteexplicitement d'objet parce qu'ondevait le faire en Python 2.7, comme
00:48:28 :en Python 2 de manière générale.Maintenant, on devrait plus le fairenormalement en Python 3.Mais tu trouves encore des tutos surle web qui héritent systématiquementleur classe d'objet.
00:48:39 :En fait, là, ce superbe, donc, ill'appelle object, il l'appelle laméthode new de object.Parce que ce que tu as pu voir dansles tutos, que ce soit sur Discord,sur DocStream ou ailleurs, c'est que,en général, on définit que la méthodeinit.
00:48:56 :Mais ça ne veut pas dire que la méthodenew, elle n'est pas exécutée.En fait, la méthode new, elle estexécutée.C'est une méthode qui appartient àobject.
00:49:05 :Et elle est toujours là.Elle est toujours exécutée.Simplement, quand tu ne définis pastoi-même la méthode new, tu exécutes,en fait, la méthode new par défaut,fournie par la classe mère qui estobject.
00:49:18 :Est-ce que c'est clair?Oui, c'est bon.C'est clair.Donc là, c'est juste...En fait, on peut juste redéfinir unpeu le comportement de new, si onveut.
00:49:32 :Sinon, il y aura le comportement pardéfaut.Voilà.Le comportement par défaut, c'estjuste de fabriquer un objet.Et puis, après, on va l'initialiser.Alors là, tu as dans ton exemplevoiture, redéfinir un comportementqui est, en plus de fabriquer unenouvelle instance, ce que tu fais avecsuper.new, et retourner l'instance,
00:49:52 :tu affiches en texte sur le terminalavec la fonction print.Donc, voilà.En fait, ça, c'est un comportement quin'est pas le comportement par défaut.
00:50:02 :Il n'y a pas d'affichage sur print.Et donc, du coup, c'est lecomportement que toi, tu as ajouté.Puis ensuite, tu as fait appel aucomportement par défaut en faisantappel à super.new.
00:50:12 :Voilà.Thierry.OK, merci.Oui.Thierry, pourquoi tu disais que c'étaitune manière horrible de créer unsingleton, ce que tu as fait tout àl'heure ?
00:50:24 :Parce qu'il y a beaucoup plus simpleen Python.En fait, c'est une manière relativementtechnique de faire la même chose quece que ferait un module en Python.
00:50:37 :Par exemple, si je veux créer unsingleton, par exemple, en Python,créons un truc que j'appelledatabase.py, par exemple.Puis mettons que là-dedans, on a uneclasse database.
00:50:54 :Désolé de t'interrompre, mais en fait,à quoi ça sert un singleton ?Ah, voilà.Un singleton, comme le mot dit single,seul, OK, c'est, tu as des situationsoù tu veux créer plusieurs objets dansun programme.
00:51:14 :Par exemple, si tu as des utilisateurs,peut-être que tu vas utiliser plusieursinstances de ces utilisateurs.Mais tu as des situations où tu veuxêtre sûr qu'une classe ne pourra créerqu'un et un seul objet.
00:51:30 :Par exemple, si vous voyez monvisualization au code, là,où je n'ai pas partagé.Oui, on le voit.Imaginons que je fais un petit programmeavec une petite base de données.
00:51:47 :Par exemple, je fais un programme en lignede commande sur des gestionnaires debibliothèques.Je sais qu'il y a quelques semaines,j'en avais déjà fait ensuite un,une fois en question.
00:51:56 :Et puis, pour un petit programme comme ça,je n'ai pas forcément besoin qu'il y aplusieurs parties de mon programme quifassent plusieurs connexions à la basede données.
00:52:05 :Une seule connexion à la base de donnéesme suffira pour envoyer mes requêtes.Donc, je pourrais vouloir faire qu'il n'ya jamais plus qu'une connexion à la basede données, par exemple.
00:52:19 :Donc, je pourrais me dire que,si j'instancie database, ici,si j'instancie deux fois,pour instancier database,je ferai typiquement ça.Puis, je récupérerai une connexion, ici.
00:52:32 :Là, je créerai une connexion.Mais si je le réexécute une deuxième fois,ici, connexion deux,je vais créer une deuxième connexion.Vous êtes tous d'accord avec ça ?
00:52:45 :Là, j'ai deux connexions à une mêmebase de données.Mais, justement, avec New,avec ce pattern du singleton,je peux faire que, en fait,dans mon projet, même si j'instanciedeux fois database, c'est la même instanceque je vais retrouver dans connexionet connexion deux.
00:53:06 :Il va simplement créer une premièreinstance, une première connexion à mabase de données, ici.Et quand je réexécute database,par exemple, il va simplement savoirqu'il a déjà créé une instance par le passé.
00:53:19 :Et puis, il va renvoyer cette instance.C'est pour ça qu'on a ce truc-là,ou ici, où d'abord, on a cette variableinstance qui est à None.
00:53:31 :Puis après, dans notre New,on fait ça, on teste vraimentsi instance est à None.Et si instance est à None,alors, dans ce cas seulement,on crée une instance de notre base de données.
00:53:43 :D'ailleurs, ça, c'est inutile.Voilà.On crée une instance à notre base de données.C'est dans le mode le plus simple.Et ensuite, on retourne cette instance-là.
00:53:56 :Donc, en fait, il n'y a que la première foisque je crée un objet,où il y a une instance en objetde cette classe qui va être créée.
00:54:07 :Et la deuxième fois,il n'y a pas cette ligne de création,parce qu'une première instance aura été stockée ici.C'est directement l'instance qui a été créée.
00:54:18 :Donc là, c'est dans ce cas-là,avec ce cinglodon,j'ai deux appels à database,mais j'ai qu'un objet qui est fabriquéet qui est lié à deux variables différentes.
00:54:29 :Donc, les deux variables pointent sur le même objet.Maintenant, techniquement,voilà, ça, c'est relativement complexe.La manière la plus simple,c'est probablement de me faire une connexion ici,une connexion database.
00:54:45 :Ça, c'est finalement la recommandation en Python,c'est de ne pas se compliquer la vie,donc d'essayer de faire simple.Et ensuite, de n'importe quelle autre partiede mon programme,j'ai simplement à importer,de faire un from database,import connection,connexion français, pour le coup.
00:55:07 :Et du coup,le mécanisme des modules en Pythonfont qu'un module n'est jamais exécutéplus d'une fois dans le cycle de vie d'un programme.Donc, quand je démarre un programme Python,un module n'est exécuté qu'une fois.
00:55:22 :Donc, je suis sûr que cette connexionne sera jamais exécutée plus d'une fois.Et donc, si j'importe cette instance-làde n'importe où dans le programme,si je crée un autre module,autre.py,
00:55:36 :et que je refais un from database,import connection,je suis certain que main et que autre,ils ont accès à la même connexion.Il n'y a pas de création d'une nouvelle connexion.
00:55:52 :Je peux même ici aller rendre ça privé,pseudo privé,pour éviter qu'on veuille importer la classe,mais qu'on apporte juste la connexionqui a été créée la première fois.
00:56:03 :Et puis, on importe partout dans le programme.Si j'ai besoin de ma connexion à la base de données,je vais importer ma connexion.Et puis là, j'ai un singleton très simple.
00:56:14 :Et il est très simple parce que finalement,il profite d'une propriété des modules Python,qui est le code d'un moduleest exécuté une et une seule fois.
00:56:23 :Donc, si je l'importe dans mainet que je l'importe aussi dans autre,en fait, il est exécuté une première fois ici.Et puis là, il n'est pas réexécuté.
00:56:33 :C'est simplement l'objet création,mais renvoyé directement,sans que le module database soit réexécuté.Donc ça, c'est une manière justedix fois plus simple et moins obscurede créer un singleton.
00:56:47 :Mais c'est le premier exemplequi m'est venu à l'espritquand on a parlé d'utiliser la méthode newdans notre cas de figure, par exemple.C'est pour contrôler ça.
00:56:58 :Techniquement, il y a d'autres possibilitésd'utiliser new, par exemple,si vous voulez créer une classe,si vous voulez créer un tuple particulier.Par exemple, techniquement,les classes de les objets de Python,les dictionnaires de Python,les listes de Python, etc.
00:57:18 :Vous pouvez aussi créer des classesqui en héritentet créer votre propre dictionnaire.Par exemple,vous pouvez créer votre propre tuple.Le problème, c'est que le tuple,il n'est pas modifiable.
00:57:29 :Donc, appeler une méthode init sur un tuple,ce n'est pas possible.On ne peut pas modifier le contenu d'un tupleune fois qu'on l'a créé.
00:57:36 :Pour ceux qui ne connaissent pas les tuples,les tuples, c'est ça.Par exemple, ici,une fois que j'ai créé un tuple,je ne peux pas modifier son contenu.
00:57:46 :Pareil, quand j'ai créé un objet tuple,on ne peut pas appeler une méthode init.Donc, ce qu'on peut faire sur un tuple,c'est uniquement en utilisant new.
00:57:56 :On peut simplement agir sur le tupleavant même que l'objet soit créé.Une fois qu'il est créé,il est non mutable et impossible de créer.
00:58:04 :Mais nous, on rentre probablementdans des détails plutôt obscurs de Python.Probablement, on a 15% des développeurs Pythonqui ont besoin de ce genre de chosesquelquefois dans leur vieet la plupart des autres n'en ont pas besoin.
00:58:20 :Mais garder en mémoire d'aujourd'huiqu'il existe un réel constructeur en Pythonqui est newet que ce new permet de contrôlerla création des instances d'une classeet que parfois, ça peut faire du sensde vouloir contrôler la création de ces instanceset dans ce cas-là, new est fait pour ça.
00:58:42 :Mais dans tous les autres cas,c'est-à-dire probablement dans 95% des cas,une méthode init va suffire.Quand on dit new,ça va limiter la création des instances.
00:59:01 :En fait, c'est juste en mémoire.C'est juste qu'on peut associer deux nomsà un même objet, c'est bien ça.C'est un peu comme le int.
00:59:11 :Donc dans mon exemple de singletonque j'ai fait avant,si je prends un truc comme ça,si je prends mes variables que j'ai créées avant,par exemple, ici, connexion1,je ne sais pas si je peux mettre un truc là,connexion, et puis un autre objet,connexion2,et puis ce qu'on a fait avant,
00:59:39 :c'est qu'on a créé un singleton,qui crée un objet,donc cet objet,c'est ce rectangle,c'est ma base de données.Si je n'ai pas de singleton,quand je crée deux objets,j'ai effectivement deux objets.
01:00:01 :J'ai une première variable connexionqui pointe sur un objet de base de données,puis une deuxième qui pointe sur un deuxième objetcréé à la même classe.
01:00:09 :Mais quand j'ai le singleton,j'ai mon objet,et puis mes deux variablesréférencent ce même objet.Donc ces deux variablessimplement pointent sur le même objet.
01:00:23 :Ce qui fait que si je modifiecette connexion à la base de donnéesou certaines propriétés,cette modification va se répercuterau niveau des deux variables.
01:00:34 :On a le même phénomène avec une liste.Ce partage de variables,si vous avez déjà essayé,liste 1, par exemple.Liste 2égale liste 1.
01:00:53 :Ici, typiquement, ce qu'on fait,c'est qu'on a une liste qui est créée à liste 1,puis ensuite on partage cet objet avec liste 2.Maintenant, si j'ajoutedans liste 1un objet,ici la valeur 1,on voit que 1 a été ajouté dans la liste,mais on voit que si j'accède à cette même liste
01:01:22 :par la variable liste 2,j'ai aussi cet objet 1 à l'intérieur.Donc cette liste-là est la même chose.Ici, on a liste 1.Ici, on a liste 2.
01:01:33 :Et ici, on a la liste,effectivement, qui est là.Et liste 2.Et puis, ils pointent sur le même objet.Ce qui fait que code via liste1.append,
01:01:45 :j'ajoute une valeur à l'intérieur de cette liste,liste 2 voit aussi cette valeur.C'est l'idée derrière ce égal ici.Liste 2 égale liste 1.Il n'y a pas de copie ici.
01:01:58 :Il y a réellement un partage de la liste.Si je veux une copie,je peux faire soit utiliser la méthode copie,soit je peux faire une copie de listeen faisant quelque chose comme ça, par exemple.
01:02:12 :Si nous faisons ceci,nous voyons que, du coup,on fait une copie de la liste 1qu'on va stocker dans liste 2.On crée un nouvel objet.
01:02:20 :Maintenant, j'ajoute la valeur 1dans la liste, liste 1,qui contient bien le 1 ici.Mais maintenant, liste 2 est toujours videparce qu'ici, j'ai une copie,tandis qu'ici, j'ai un partage de la liste.
01:02:35 :Donc ça, c'est également des fondamentauxde Python à bien garder en mémoire.C'est le partage des objets.Le singleton ici, en l'occurrence,qu'on a rendu possible avec New,nous amène à ce type de partage d'objetsici pour nos connexions.
01:02:54 :Nos deux connexions partagent le même objet.Si je crée une troisième connexion,elle pointerait vers la même base de données,simplement le même objet.Donc ça, c'est l'idée derrière ce contrôle-là.
01:03:05 :En fait, c'est comme ça que c'est implémentépour Int, par exemple, non ?Ils ont modifié le comportement de Newpour certains entiers qui sont déjà prêts à jouer.
01:03:14 :Pour certains entiers, c'est un petit peu comme ça.Effectivement, ça, c'est le détail d'implémentation.Certains entiers de l'indice, par exemple,ou des petites chaînes de caractèrevont être créés une fois et partagés ensuitepour des questions d'optimisation.
01:03:29 :Donc là, il y a probablement quelque choseau niveau du New de la classe Int.Finalement, ce qu'on ne sait pas forcément,c'est que les objets de Pythonsont aussi créés avec des classes,la plupart du temps implémentées en C,mais c'est la même mécanique derrière.
01:03:47 :Et effectivement, il y a probablement quelque chosequi dit que quand l'entier est inférieurà 10, 20 ou 30, etc.,on ne va pas le recréer deux fois,mais on va le stocker dans un espace centralisé.
01:03:59 :Et à chaque fois qu'on en a besoin,on va aller rechercher le même objetpour éviter de perdre finalement de la mémoire,perdre du temps à aller aussi créer de nouveaux objets.
01:04:10 :Et donc, il y a un mécanisme de cache comme çaqui est particulièrement pertinent pour les entiersou pour les petites chaînes de caractèreparce que c'est des objets qui sont non mutables.
01:04:21 :Et donc, de ce fait, c'est une stratégie intéressante.Quelque part, on n'a pas besoin de le savoir.Je sais qu'il y a pas mal de personnesqui débutent en Python,qui jouent avec le mot clé IS.
01:04:33 :Parfois, ici, ce qu'on peut voir,c'est que si A est égal à 1,et puis que B est égal à 1,et puis qu'on teste si A IS B,il va dire TRUE,alors que j'ai créé deux objets 1 ici.
01:04:53 :Si je le fais pour 10 000 deux foiset que je réexécute ce code,il va dire FALSE.Parce qu'en fait, pour 10 000,il va créer deux objets différentsqui correspondent au nombre 10 000et associer cet objet à A.
01:05:15 :Puis là, il crée une deuxième fois l'objetet il l'associe à B.Et puis, on teste si A et Bpointent sur le même objet.
01:05:23 :Et puis là, il me dit NON.Alors que quand je le fais avec 1,ou avec 2, etc.,avec des petits nombres,il va dire OUI.
01:05:31 :Mais quelque part,ce serait une erreur, à mon avis,en termes de programmation,de se préoccuper de ça.Ça veut dire que n'allez en tout cas pastester si A IS 1 dans une condition.
01:05:44 :Ce serait très mauvais.On peut le faire avec ID.ID, c'est un petit peu la même chose que...ID, c'est la même chose que ce IS.
01:05:58 :Donc ID ici,on peut tester, effectivement,c'est la même adresse,c'est le même ID en mémoire.Mais de nouveau,ça c'est un détail d'implémentation.Si ça fonctionne avec CPython,typiquement CPython,c'est l'interprèteur Python que vous utilisez,probablement que ça fonctionne aussi avec PyPy,qui est un interprèteur Python,implémenté en Python.
01:06:23 :Mais techniquement,il n'y a aucune garantie.Comme c'est un détail d'implémentation,c'est quelque chose qui pourrait changer,par exemple.Et donc,ce n'est pas quelque chose qui est appeléà être utilisé dans du code.
01:06:36 :Donc ici,n'utiliser pas dans du code le fait queA et B ont le même IDparce qu'ils pointent sur le même objet.Ce serait une grosse erreur, à mon avis,parce que dès que vous allez le faire avec,je ne sais pas,vous voyez,j'en fais depuis pratiquement plus de 24 ans maintenant.
01:06:55 :Et je ne sais plus à partir de quand ça s'arrête,mais manifestement,si on regarde A et B ici,22, c'est encore bon.Vous pourriez incrémenter çajusqu'à ce que ça devienne des objets différents.
01:07:10 :Mais à mon avis,de toute façon,on a déjà quelque chose de différent ici.Non,ça,encore la même chose.On a vu avant qu'avec 1000,on avait des objets différents.
01:07:25 :Voilà,donc 1000,etc.Donc,vous pouvez tester.D'accord,donc,les 8 premiers bits d'entrée,donc,ici.A priori,dans un code applicatif,vous avez,finalement,peu d'intérêt,à mon avis,ou peu de gain,quelque part,à vous appuyer là-dessus.
01:07:51 :Mais au niveau de l'interpréteur de Python,en pratique,comme on fait beaucoup de choses avec des entiersqui sont de petite taille,quand on,par exemple,parcourt une listeou quand on énumère quelque chose,on va à chaque fois devoir créer à chaque fois des entierset,à chaque fois,
01:08:10 :ils vont commencer à zéroet puis ils vont s'incrémenter jusqu'à 100,200,etc.Donc,le fait d'avoir les 200 premiers entiersqui ne sont créés qu'une seule fois,il y a un intérêt,du point de vue de l'implémentation,de la performance.
01:08:24 :Ça ne veut pas dire pour autant qu'en tant que développeur,il faut s'appuyer là-dessus.Donc,techniquement,on n'a pas enviede voir dans une condition,ifA is 1,par exemple,ici,continuer à tester,à être explicite,parce que A égale 1va fonctionner exactement de la même manière
01:08:42 :si vous avez 1ou si vous avez 1000.Et donc,ici,ce seraitune dérive,à mon avis,de devoir se dire,OK,mon nombre est en dessous de 156,donc,ici,A is 122,alors,dans ce cas,je vais faire quelque chose,je vais utiliser le symbole d'égalité
01:09:03 :etla plupart du temps,c'est vraiment plutôt,ID est plutôt faitpour comprendre ce qui se passe,pour comprendre ce dessin-là,pour comprendre que deux variablesvont pointer à certains moments sur un même objet.
01:09:18 :Et ça,c'est intéressant au début,par exemple,se dire,OK,ici,j'ai deux listes,ces deux listes,elles pointent sur le même objet,donc,l'ID de la liste 1et l'ID de la liste 2sera la même.
01:09:31 :Je comprendsde quoi ils retournent.Mais,techniquement,je crois queje n'ai jamais eu,dans un code,de nécessitéde testerici,alors,pour une liste,encore,ça pourrait se faire,mais pour un entier,je n'ai jamais eu besoinde tester l'identitéet de vérifierque Aétait bien
01:09:51 :la mêmevaleurque1,par exemple,etc.Donc,je dirais,easeà ne pas utiliserdans le cadre des entiers.C'est du détaild'implémentation.Et,coder pour l'implémentation,c'est le meilleur moyend'avoir un codequi est casséun jour ou l'autre.
01:10:10 :Mais,par contre,parfois,on aime bienapprendreque le langagequ'on utilisefait des optimisations,puis au début,on passe pas mal de temps,donc,je vois aussiparmi mes étudiantsà l'haute écoleoù j'enseigne,qu'il y a énormémentde questions au début,je me dis,il y a énormément
01:10:29 :de questions au début,justement,sur ces optimisations,sur ID,sur ease,à quoi ça sert,etc.Alors,on passe vraimentdu tempsà voir à quoi ça sert,on passe du tempsà vérifierces identités,mais après,il faut éviterde les utiliserconcrètementdans son code.
01:10:48 :La seule identitéque j'utilisetrès souvent,c'est de savoirsi quelque chose vautnon,alors,et si une variable,donc,si ma variableest non,alors,pour tester non,alors,non est garantiqu'il existeraune seule foisdans votre programme,donc,il n'y a qu'un objet,c'est un singleton,
01:11:09 :donc,non est un singleton,et pour le coup,vous pouvez testersi votre variablecontient non,vous pouvez dires'il est non,et paf,là,vous n'utilisezuniquement pasle symbole d'égalitépour non,donc,vous allez testers'il est nonetc,et si ma variablen'est pas non,par exemple,
01:11:30 :si ma variableest non,ici,ma variableégale non,dans ce cas,cette condition est vraie,ici,et puis,on va passer ici,ma condition,là,elle est fausse,ici,elle est vraie,ok ?
01:11:46 :Donc,non,typiquement,c'est un objetqui est garantien Python,il n'existera qu'une fois,et donc,je peux utiliserdeux variablesqui ont,toutes deux,la valeur non,en fait,elles pointent exactementsur le même objet,ça veut dire quema variableici,et ma variablede,variable de,
01:12:09 :ici,pointent les deuxsur le même objetnon,et pour le coup,je peux testeravec ease,et vérifierqu'elles pointentsur ce même objetqui n'existeraqu'une foisdans votre programme,donc,même si vous avezdeux variables,les 10 000 pointerontsur le même objetnon,si elle valent non.
01:12:29 :Donc,voilà,ça,c'est un comportementgaranti,et c'est typiquementen endroit,en Python,vous allez utilisersystématiquement le ease,tandis quedans le contextedes entiers,vous n'allezpratiquement jamais utiliserle ease,et probablementjamais utiliser l'ID.
01:12:47 :Je ne crois même pasme remémoreravoir utilisé dansles faits IDune foisdans les 25Voilà,est-ce qu'il y aencore des questions ?
01:12:57 :En fait,un singleton,c'est le même principequ'en maths,c'est une classequi contientune seule instance.Voilà,exactement ça.Et ce dont on aparlé tout à l'heureest finalementune manière,avec New,une manièrede forcercette classeà ne contenirqu'une instance.
01:13:16 :Parce que,naturellement,il y atoujoursune instancequi estnaturellementchaque foisque tu vasexécuter cette classe,tu vas recréerune instance.Donc,en fait,on ne doit paslaisser,si on a une classequi ne peut pas avoirplus qu'une instance,on doit vraimentforcer ce comportement
01:13:37 :parce que,par défaut en Python,les classespourront forcémentavoir,pourront créerun nombreindéterminé d'instancesen fonction des besoins.Et si j'ai besoinde limiter ça,à ce moment-là,c'est une des applicationsoù Newest utile.
01:13:52 :Un autre endroitoù Newest utile,c'est quandon veutautomatiserdes chosesà la créationd'une classe.Mais là,ça devient vraimenttrès techniqueparce que là,on parleplus de classemais de métaclasse.
01:14:08 :Finalement,une métaclasse,c'est rien d'autrequ'une classe.Et,typiquement,Djangofait ce genre de choses.Parce qu'on a parlébeaucoup de Djangoavant.Djangonous permet,par exemple,de créerdes...
01:14:24 :C'est la dernière choseque je vaismontrer aujourd'hui,probablement.Mais,si je thématise,en Django,on va créerun modèle,par exemple,un modèlearticle.
01:14:36 :Donc,on crée çaà partird'une classequi s'appellemodèle.Et,comment est-cequ'on créecette classe ?On créequelque chosedu style.Donc,je créeun titreet puis,je définisce titred'une certainemanière.
01:14:57 :Au final,vous avez tous apprisà utiliserdes classes.C'est pascomme...Alors là,je vaiséliminerce petit détailpour éviterd'avoir une erreur.
01:15:09 :Et,ici,vous avez tous apprisqu'en Python,pour définirun attributtitle,en fait,c'est pas comme çaqu'on fait.Pour définirun title,vous faitesun init,et puis,après,self.title
01:15:26 :on va diresi je le fais simpleet puis ici,un title.Et puis,là,j'auraiun attributtitle.En Django,on peut l'écrirecomme ça.
01:15:38 :Et puis,Django va s'occuperde prendrece title-làet de l'utiliserpourdéfinirun attributtitle.Donc,il va s'occuperde prendrece title-làet puisde transformeren ça,si vous voulez.
01:15:55 :De fairecette transformationautomatiquement.C'est-à-direqu'il va lireles variablesici,ce qu'on appelleraitles attributsde classeet va transformerces attributsde classeen des attributsd'instance.
01:16:10 :OK ?Comment est-cequ'il fait ça ?Il vaêtre responsablede fabriquercette classe-là.Et donc,du coup,il va faire quequand on fabriquecette classeet qu'on voitqu'on a un titleici,on vacréer une méthodeinitautomatiquementqui vacréerce title.
01:16:32 :Et puis,typiquement,pour faire ça,Djangoutilisenewsur une métaclasse.Ici,il y avaitun développeur,encore développeurPythonqui s'appelleAlex Martelliqui disaitsi vous ne savez pasce que c'est une métaclasse,c'est probablementque vous n'en avez pas besoin.
01:16:51 :Donc ici,on va direqu'il y a probablement10%desdéveloppeurs Pythonqui ont réellementbesoinde savoir ce que c'est.C'est ceuxqui vontimplémenter des frameworkscomme FastAPIou comme Djangopour les autres.
01:17:06 :C'est pas nécessairede le savoir.Mais ce qui est nécessairede savoirsuite à la discussiond'aujourd'hui,c'est que le newpeut servirà les modifierdes comportementsinternes de Pythonparfois.
01:17:18 :Parfois,c'est utiledans relativementpeu de cas.Mais on a vuaujourd'huiun petit peucomment fonctionnaitce init.Donc si vous regardezce init et ce newet si vous regardezla rediffusiond'aujourd'hui,n'hésitez pasà étudiercette partiesur le newet à revenirde nouveausur le docstring
01:17:39 :surla premièreprochaineforo question.En fait,j'ai décidéqu'on allaitpérenniser çaavec Thibaut.C'est-à-dire quecette foro questionon va la fairenormalementtous les mercredismais la semaine prochainece sera encoreen mardi.
01:17:56 :Et ensuite,tous les mercredison fera cette petiteforo questionoù vous pouvez poserdes questionscomme vous voulez.Voilà.Thierry,j'ai vu quemardi prochainl'horairec'est 22h10.
01:18:09 :Non,c'est une erreur.C'est sympade me l'avoir ditcomme ça,je peux la corrigerjuste après.Tu disais queaprès ça reprenddes mercredismais il s'est annoncépour le 15et pour le 22.
01:18:22 :Oui,donc la semaine prochainec'est encorele mardi.Et la suivanteaussi alors ?Il faut queje regarde.Mais probablementoui,le mois d'octobrec'est un petit peuperturbéparce qu'il y ades événementssur docstringqui sontdéjà missur les mercrediset du coupje me suis dit
01:18:43 :qu'il y auracertains d'entre vousqui parfoispeuvent être intéressésà assisterà ces événements-làet puisqui n'ont pasforcément enviede devoir trancherentre la foire aux questionsou alorsentre l'événement.
01:18:56 :Donc moij'essaie de m'adapter.Effectivement,je ne me souviens plusles...Je vais essayermaintenantde planifierdirectementle mois de novembreaussi.Comme ça aprèsle terraindu mercredià 21htout le tempscomme çail y a une certaine régularitéet c'est toujours plus simpled'avoir du monde
01:19:16 :quand il y aune certaine régularitéquand on saitqu'on peut noterces questionset puis on peutvenir les posersystématiquementle mercredisi nécessaire.
01:19:26 :Donc je vaiscorriger çapour la semaine prochaine.Non,je dors déjàà 22h30en généraldoncje ne suis pas sûrque je serai en étatde donnerune sessionde mon Thoradonc ce serabien 21h.
01:19:41 :Super,merci beaucoup.Je vous en prie.Merci beaucoup.Très intéressant.Je vous en prie.Ouais,merci beaucoup Thierry.C'était très clair,intéressant,déployé.C'est excellent.
01:19:53 :Merci.Pour moiqui commenceun peu du tout.Ok,du coup,je l'espèreque ce n'était pastrop techniqueau débutavecl'initiativeDjango.C'est vrai qu'on doitcomposer avecdes personnesqui commencent,des personnesqui ontun peu plus avancésur des sujets,des personnesqui font du web,
01:20:16 :des personnesqui ne s'intéressentpas du tout au web.En fait,on essaiedans cette forogationde répondreà un maximumde questions.Donc n'hésite pasla semaine prochaineà veniravec des propres questions.
01:20:29 :D'accord,c'est super sympa.Moi,j'ai commencépar Djangoet là,c'est surtoutles set-upen faitqui m'interpellentet qui me posentbeaucoup de questionsplutôt que le code mêmepour l'instant.
01:20:43 :Voilà.N'hésite pasà poser des questionssur le set-up aussi.Moi,je regarde surtoutle salonMontaurade Xtreme.Il a moinsde bruitque les autres.
01:20:55 :Du coup,ça correspond mieuxà mon emploi du temps.Mais si tu as une questionet tu veux être sûrque je la lise,pose une questiondans le salon Montauraet je la lirai,j'y répondrai.
Aucune occurrence trouvée pour « ».
00:00:00
Introduction et structure de la session
00:01:53
Questions sur les variables d'env, Docker et Cookie Cutter
00:19:40
Explication de Cookie Cutter
00:27:00
Cookie Cutter avec Django
00:34:12
Discussion sur la méthode New en Python
01:03:05
Explications sur la gestion de la mémoire de Python
01:13:05
Le Singleton et l'utilisation de new
01:14:11
L'exemple avec Django
01:16:22
Est-il utile de connaître les métaclasses ?