Session du 02 avril 2022 à 18h00
Bases du Langage
Veille & Discussions
DevOps & Environnement
Librairie Standard & Modules
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Comprendre Git, pertes de fichiers et imports circulaires
Exploration des problèmes courants avec Git, des disparitions de fichiers après git pull et introduction aux imports circulaires en Python.
00:00:00 :Salut Arnold, du coup normalement alors c'est la première fois que je vois quelqu'un lever la maincomme ça, normalement vous pouvez prendre la parole comme ça, là en plus on n'est que troispour l'instant donc n'hésitez pas à juste parler. Salut tout le monde! Salut Christophe aussi qui
00:00:25 :nous a rejoint. Salut, bonjour! Salut! On va attendre encore une minute ou deux que les gens arrivent.Et du coup oui si vous pouvez par contre couper vos micros si vous parlez pas comme ça on auravraiment pas de soucis. Je le dis juste au début. Donc du coup oui alors il y en a pas mal pour qui
00:00:56 :la majorité, bon même si on n'est que quatre pour l'instant, pour qui c'est la premièresession de mentorat. Donc c'est ce que je demandais à Johann aussi, s'il avait eu le temps de
00:01:08 :découvrir un petit peu Docstring et aussi les sessions de mentorat. Donc je sais pas à quelpoint vous avez vu, il y a un menu pour l'accompagnement, vous avez un petit peu toutesles ressources, que ce soit la page avec les membres, les entrevues et vous avez aussi une
00:01:22 :partie pour les mentorats groupés qui vous permettent de voir les rediffusions. Là cettesemaine j'étais un petit peu dans les déménagements donc ça a pris un peu plus de temps que d'habitudepour que la rediffusion de la semaine dernière qui avait été faite par Thierry soit en ligne,mais normalement c'est mis en ligne tout de suite après donc vous avez accès la soirée même. Alors
00:01:45 :je sais pas si on va être plus que ça du coup pour ce soir. Est-ce que déjà vous avez eu unpetit peu le temps de faire du Python cette semaine et si c'est le cas est-ce que vousavez des questions qui sont apparues pendant les cours ou les exercices que vous avez faits?
00:02:01 :N'hésitez pas donc pour parler vous pouvez juste activer votre micro vu qu'on n'est pas beaucoup,il n'y a pas de souci, vous pouvez juste désactiver le micro et prendre la parole.
00:02:12 :C'est juste sur mes projets OpenCastFund que j'ai été connu, c'est juste là dessus.C'est toi qui avait eu des soucis avec Git? Avec Git, avec le static, et on devait reprendre
00:02:35 :mon code du coup, je sais pas si tu te souviens. Alors méthode static, tu l'avais posté dansPython. Alors j'avais prévu une partie sur les imports circulaires, c'était pour Loïc qui n'est
00:02:59 :pas là pour l'instant mais il verra dans la rediffusion. Je sais pas si vous avez déjà eucette histoire d'imports circulaires, si ça vous dit quelque chose. Pas du tout, par contre j'ai
00:03:09 :Git qui m'a enlevé des modules, ça existe? C'est possible? Qui t'a enlevé des modules? Des fichiersque j'ai créés, j'ai une partie de mes fichiers qui sont plus là. C'est pas normal, est-ce que
00:03:24 :tu es sûr que c'est... parce que tu peux enlever les fichiers avec des commandes Git, est-ce quetu as fait un Git RM par exemple? Je crois que j'ai fait un Git Pool quelque chose là. Ah oui, alors ce qui
00:03:39 :est possible c'est que effectivement tu es eu des... enfin comment dire, tu avais par exemple un fichiersur ton dépôt local, on va dire un fichier index.html sur ton local, et après si par exemple tu
00:03:54 :travailles à plusieurs et qu'il y a un dépôt distant et que quelqu'un d'autre a supprimé le fichier surle dépôt distant et que toi après tu fais un Git Pool, tu vas récupérer l'état du dépôt distantsur ton local, et donc là si le fichier a été supprimé sur le distant, il va également le
00:04:09 :supprimer sur ton local pour que ça corresponde les deux, pour que ton dépôt local correspondeau dépôt distant que tu as récupéré si tu veux. Donc là effectivement tu peux te retrouver avec des
00:04:19 :fichiers qui disparaissent si ça a été supprimé sur un dépôt distant. Donc c'est peut-être çaqui s'est passé, après je crois que là pour l'instant tu es tout seul sur le dépôt ou vousêtes à plusieurs? Non je suis tout seul mais du coup comment ça se passe, je ne peux plus le récupérer,
00:04:34 :je suis obligé de recommencer mon code. Oui alors l'avantage de Git c'est qu'il y a une ou deuxcommandes avec lesquelles tu peux perdre des informations, et de toute façon si tu travaillesavec un dépôt distant, c'est quand même assez dur de supprimer totalement les données,donc généralement tu peux, c'est un peu l'intérêt de Git, c'est que tu peux retourner en arrière,
00:04:57 :tu peux récupérer des fichiers qui ne sont jamais vraiment supprimés parce qu'avec tous les commitsque tu fais tu peux les retrouver souvent quelque part. Après c'est là où ça devient souvent un
00:05:07 :petit peu plus compliqué parce que du coup il faut savoir retourner en arrière dans l'historique,il faut pouvoir retrouver ces fichiers où ils sont et puis après les ramener éventuellementdans ton dépôt actuel. Donc là toi tu es tout seul sur le projet et tu as un dépôt sur GitHub,
00:05:27 :c'est ça? En fait je n'ai jamais réussi à le mettre sur GitHub. Ah d'accord, ok,parce que tu as fait un cours sur Git? Oui j'ai fait des cours mais je ne sais pas pourquoi je
00:05:41 :n'arrive pas à intégrer Git. Après je ne me suis pas non plus approfondi mais je me rends compte quevoilà c'est une grosse lacune là aujourd'hui. Git c'est normal, quand on commence tu peux
00:05:53 :t'en sortir avec deux trois commandes et puis rester avec ça pendant un an et ça va et puisaprès souvent dès qu'il y a des problèmes ou dès qu'il faut faire un petit peu plus que justeun commit, un push et un pull, donc commencer à travailler avec des branches, travailler avec
00:06:07 :plusieurs personnes, là ça peut commencer à devenir assez compliqué. Même la base aussi,quand tu commences à avoir des dépôts distants, tu peux assez rapidement tomber dans des problèmesdu genre. Moi là je suis en train d'enregistrer la formation pour Doctrine sur Git, je t'avais mis
00:06:24 :un lien je crois vers un cours que je trouve quand même assez bien fait. Après effectivementc'est très compliqué aussi d'un point de vue enseignant de faire un tuto Git parce que çapeut devenir justement très rapidement très compliqué et de trouver la bonne balance entrejuste ce qu'il faut d'informations pour ne pas perdre les gens, pour ne pas les décourager et
00:06:50 :en même temps pour que les étudiants comprennent bien ce qui se passe et que ce ne soit pas justefait cette commande et ne pose pas de questions et puis après du coup quand ça ne marche pas,bah tu ne comprends pas. C'est très compliqué, c'est pour ça que ça met pas mal de temps à
00:07:02 :sortir cette formation. J'arrête pas de changer les parties dans tous les sens et tout, c'est assezcompliqué mais j'espère arriver à un truc qui soit justement à la limite entre les deux,qui soit assez direct et pas trop compliqué mais qui vous permette de comprendre comment ça marche.
00:07:19 :Après là est-ce que tu as le dépôt sous les yeux? Si tu veux on peut regarder le dépôt.Et puis essaye de retrouver ce fichier si tu veux partager ton écran.
00:07:34 :Ouais je vais partager avec plaisir. Alors moi sur le dépôt j'ai rien du coup. C'est quoi quet'appelles le dépôt du coup? Alors là je vois pas, t'as partagé ton écran? Oui.
00:07:58 :Ça partage quoi? Moi je le vois pas, je sais pas les autres.C'est impossible de lancer le partage d'écran, le navigateur ne parvient pas à accéder. Alors
00:08:12 :je dois faire en avis une autorisation? Autorisation ou peut-être mise à jour,je sais que moi souvent Chrome il est assez pénible quand ton navigateur n'est pas à jourpour les partager. Pour les partager il faut installer Where Are We? Normalement non.
00:08:30 :Johan, j'ai un petit peu réfléchi à ton problème sur GitHub, pourquoi ça n'a pas fonctionné. Est-ceque tu as fait un SSH pour avoir une connexion sécurisée entre ton terminal et ton profil GitHub?
00:09:03 :Un SSH? Alors là pas du tout. Ah non, ouais il faut faire un SSH,en fait c'est juste un petit truc vite fait, c'est juste pour crypter les... c'est pas grand
00:09:16 :de chose. Franchement ça se fait facilement et ça te permet d'avoir une connexion sécuriséeentre ton terminal et ton site internet, enfin pardon, ton profil GitHub et du coup tu peuxensuite après avoir accès à ton profil GitHub à distance et transférer, faire ton push en fait,et mettre ton projet dans ton profil. Effectivement je crois que maintenant,
00:09:52 :c'est parce que ça a pas mal changé ces derniers mois, avant tu pouvais juste passer par un motde passe classique et je crois que maintenant ils ont enlevé cette option totalement. C'est ce genre
00:10:01 :de truc aussi que tu fais une fois et une fois que c'est setupé tu n'as pas besoin de le refaireà chaque fois et du coup c'est vrai que je suis plus sûr si tu peux passer par le mot de passeencore. Et effectivement si je vais te mettre la documentation dans le chat, les clés SSH
00:10:18 :effectivement si t'as jamais fait la première fois ça fait un petit peu peur, même si c'estpas compliqué au final, mais si tu veux... Alors j'ai regardé la documentation, bizarrement ils
00:10:28 :l'ont pas en français, elle est vraiment juste en anglais, ce que je trouve assez bizarre pourGitHub, mais bon après tu peux facilement la traduire et puis faire tout ce que t'indiquela doc. T'es sur Mac ou Windows Johan? Sur Mac. Sur Mac ok, bah du coup t'as effectivement,
00:10:46 :c'est un peu comme sur Linux, du coup Mac, Linux, il faut que t'ailles chercher la clé,il faut que tu la récupères de GitHub, il faut que tu la mettes dans le dossier.ssh,
00:10:57 :donc il y a pas mal de petites étapes à faire mais tout est indiqué et puis effectivement c'estça qui va te permettre après de pousser et de récupérer ton code sur GitHub depuis ton dépôtlocal. Par contre j'arrive pas à partager l'écran. Comment c'est possible ça? C'est peut-être des
00:11:22 :trucs d'autorisation, c'est plus en plus compliqué. Sur Chrome il y a quelque chose de spécial? Nonmais ça se peut que si t'es sur Mac, il empêche le stream d'écran, qu'il faille l'activer dansles préférences, c'est possible. Bon du coup Loïc vient de dire qu'il pourra pas être là,
00:11:48 :moi je vais quand même vous parler des imports circulaires parce que je suis sûr que vous allezun jour tomber dessus et c'est un petit peu plus avancé, enfin on va parler de modules tout ça,donc je sais pas si vous avez tous déjà séparé un petit peu votre code entre différents modules,
00:12:07 :mais vous avez pas forcément besoin de comprendre toute la logique des modules pour comprendre leserreurs qui peuvent arriver, parce que vous allez voir que c'est une erreur assez... on comprend
00:12:19 :assez facilement pourquoi l'erreur peut arriver et je vais vous donner aussi des façons de larésoudre et comme ça si vous tombez sur cette erreur ou sur ce problème souvent en plusd'organisation de code dans quelques semaines ou quelques mois, et bien vous saurez pourquoi.
00:12:34 :Ah là ça marche, ah yes. Bah du coup je te laisse filer, désolé. Non non mais par contre je m'entends.Moi aussi il m'embête pour partager mon écran, j'ai essayé et il m'a demandé de réactiver lesautorisations, du coup il va falloir que je ferme le fond, que je le rouvre. Du coup,
00:13:43 :ouais alors j'ai encore l'écho, je sais pas si tout le monde l'a. T'as un casque? Non? Ok,là il est plus là. Là c'est bon on voit ton écran. Donc tu vois il y a rien,
00:14:24 :parce que j'ai jamais rien mis. Qu'est ce que j'ai fait? Bah j'ai rien sur mon GitHub. Ouais,t'as l'heure et demie seulement. Et on voit bien ici tous les modules ont disparu, tous les modules
00:14:43 :que j'avais créés, donc avec le code qu'il y a dedans, tout a disparu quand j'ai tapé mes codes.Je pense que j'ai fait un pool, parce que j'ai fait plusieurs manips, parce que j'arrivais pasà le mettre, en fait ça restait bloqué sur mon premier repo que j'avais créé, j'ai réussi à
00:15:00 :trouver une manip qui m'a changé mon URL et j'ai pu le mettre sur le bon URL, et après ça memettait plein de messages d'erreur quand je voulais le push, ça m'était in it, je sais pas quoi,non pas bon, pas bon, et ensuite quand j'ai voulu, je crois que j'ai fait un pool quelque chose,
00:15:15 :je me rappelle plus c'est quoi, et après j'ai vu que tout a changé sur le côté, sur cette barre là,ça a fait une mise à jour là, et en me rendant compte que ça m'a enlevé ces trois modules.
00:15:23 :Ouais, alors je pense que ce qui s'est passé c'est que tu devais avoir un dépôt GitHub surlequel tu avais bien poussé ton code, et de ce que je comprends, tu me dis que tu as dû changerdonc l'URL de ce qu'on appelle le remote, donc le dépôt sur GitHub, qui lui ne contient pas le code,
00:15:42 :et après forcément effectivement si tu as fait un GitPool à partir du dépôt que tu m'as montrélà, qui contient juste le README, du coup tu as perdu le... alors ce qui est bizarre c'est que
00:15:54 :tu es quand même encore défiché, parce que je me dis que si tu as fait un GitPool, normalement tudevrais avoir juste le README, alors peut-être que mon intuition c'est que si tu avais en faitle fichier, enfin non même pas, je vais dire non. Non, parce que le fait d'avoir changé l'URL,
00:16:11 :ça ne m'a pas enlevé, ce n'est pas là que ça m'a enlevé, mes fichiers étaient encore là, c'est quandj'ai fait une autre manip, parce que là tu vois, par exemple ces fichiers là, ces modules là,ils étaient créés longtemps avant ces deux là, tu vois, c'est mes deux derniers modules, enfin celui-là
00:16:24 :c'est mon dernier module, donc je comprends pas pourquoi ils m'ont enlevé les autres, parce quec'est les premiers, c'est genre mes premiers modules. Alors c'est que ça doit être que les fichiers en
00:16:35 :fait sont pas, tu les as pas ajoutés, ils ont pas été traqués, suivis par Git, donc en fait Git ilva pas y toucher. Par contre si c'est des fichiers, il y a des fichiers que tu avais déjà ajoutés dans
00:16:48 :le suivi de Git, et que finalement dans ton dépôt après ils y sont plus et que tu fais un GitPool,bah là il va dire toi tu les as dans ton local, sur le dépôt ils y sont plus, donc je les enlève,je les supprime. Donc c'est à mon avis c'est ça, c'est que tes fichiers comme le fichier Controllers,
00:17:02 :tu l'avais ajouté dans le suivi de Git, et comme là il se retrouve plus dans ton dépôt sur GitHub,bah pour que ça corresponde avec ton dépôt sur GitHub, il te l'a enlevé. Alors que les fichiers
00:17:12 :qui sont pas traqués, les fichiers qui sont pas suivis, il y touche pas. Là moi je te dirais derefaire en fait le mieux je pense, alors ouais après du coup là t'as perdu tes fichiers, alorsfais déjà première chose à faire, tu fais un GitStatus, dans ton voilà ici, GitStatus, ça va
00:17:34 :nous donner des informations, et étend un petit peu la fenêtre là, ouais qu'on voit tout le...encore ouais vas-y autant que tu peux, ok alors donc ah oui donc là ok donc là en fait t'as unRebase qui est un... donc en fait il y a eu des... ouais donc en fait t'as un processus qui est en
00:18:03 :cours en fait, et là il faut que tu fixes, donc tu dois avoir des conflits et en fait pour résoudreles conflits et puis après continuer, ajouter les fichiers et dire que tu veux finir le processussi tu veux. Donc là ce qu'il faut faire c'est plutôt arrêter le Rebase parce que si t'es pas
00:18:25 :sur le bon repo, donc en fait il vaut mieux annuler ce Rebase, donc pour ça c'est GitRebaseAbort,alors attends je vais te retrouver la commande précise, je crois que c'est juste "-abort",j'ai vu Thierry qui nous a rejoint, salut Thierry, c'est juste "-abort", il n'y a pas plus que...
00:18:47 :ouais je me plante pas. Normalement il te le... il me semblait qu'il te le disait quand tu fais unGitStatus, qu'il te disait... donc essaye avec ça Git... non Rebase, excuse je me suis planté dans
00:19:00 :la commande, GitRebase, je vais y arriver, je te l'ai mis dans le chat, la dernière, pas lesdeux premières, et donc ça normalement je me semblait qu'il te le disait, là il te dit justele continue, je l'ai mis dans le chat du... le dernier, donc ça va arrêter le processus,
00:19:35 :et après on referait un GitStatus pour voir où ça en est. Alors attention, ok donc là refait unGitStatus, et là tu vois... ok, donc déjà on est revenu à quelque chose d'un peu plus normal,
00:20:05 :donc là ce qu'il te dit c'est que... déjà tes fichiers sont de retour, et parce qu'en fait donclà tes branches ont divergé entre ta branche locale et ta branche sur le GitHub, et c'est plussynchronisé si tu veux. Là le truc que tu peux faire c'est déjà vérifier quelle est l'URL du
00:20:32 :remote, alors ça c'est GitRemoteGetURL, et je sais jamais à chaque fois qu'on a dit GitRemoteGet,alors faut mettre "-get", je vais pas trouver la compte. GitRemote-V puis tu les as tous avec
00:20:48 :l'URL. Oui ça peut être ça aussi. Ah c'est ça que je cherchais, je l'avais tapé tout à l'heure,GitRemote-URL. Donc là je suis bien sur le bon, c'est ça que j'avais changé l'URL. Et par contre
00:21:06 :donc si tu mets cette URL dans ton navigateur, est-ce que c'est le même dépôt que tu avaistout à l'heure avec juste le ReadMe? C'est ça. Ouais d'accord, donc là t'as juste le lisez-moi
00:21:20 :même. C'est pas vraiment possible qu'il soit en retard qu'on avance, parce qu'à moins qu'onait le... On a un lisez-moi sur le projet en local là. Là c'est un ReadMe qui a été changé. Ouais je
00:21:46 :pense que tu dois avoir une traduction sur Safari, non? Parce que j'ai vu que le commit a ététraduit aussi par engagement, donc je pense que ça doit être ça. Ce que tu peux essayer c'est
00:21:56 :plutôt de faire un git pull, tu fais un git fetch origin et ça va rapatrier le code du remote.Puis on peut éventuellement l'explorer ici. Et puis maintenant si tu fais un git checkout,
00:22:23 :alors c'est origin slash fetch slash main, master, check out, et puis la branche. C'est main ouais.Tout coller, tout coller, slash main. Slash, barre oblique si tu veux. Mais tout coller,
00:22:54 :pas d'espace entre origin et puis là. Et puis main. Ouais alors c'est ce qui est bizarre,il y a un track. Ah oui parce que t'as le ReadMe qui est pas tracké, donc pour l'instant il ne
00:23:12 :te laisse pas changer de branche. Non, il ne devrait pas. Effectivement il ne te laisse pasparce que le ReadMe pour l'instant il n'est pas comité. Moi ce que je fais quand je fais ça,
00:23:35 :je fais des stashes mais je pense pas que c'est ce qu'on veut ici faire. Franchement git c'estvraiment quelque chose de complexe. Tant que ça part pas, tant qu'on est bien à jour dans ce
00:23:59 :qu'on a et qu'on n'a pas une divergence entre le remote et puis notre travail, ça va. Aprèsc'est clair qu'il y a quelque chose d'un petit peu plus technique quand on a été par exemple fairedes choses sur le remote et qu'on n'a pas fait sur... Là je pense qu'il n'y a pas beaucoup
00:24:15 :qui divergent. A mon avis il n'y a que le ReadMe qui doit diverger entre les deux parce que eninstant tu as qu'un ReadMe. A mon avis c'est juste que le ReadMe est d'origine différente. On le
00:24:30 :lisait moins. Et pour un local alors qu'il est en mer, les conflits ne doivent pas être très longà gérer mais quand on n'a jamais fait c'est sûr que c'est pas si évident. Après là du coup,
00:24:45 :tu as beaucoup plus de fichiers que dans ton dépôt remote. Tout est dans un dossierprojet 4. Et tu as ton environnement. Vu ce qui est actuellement dans le remote,
00:25:07 :je serais très pragmatique dans ce genre de cas. C'est à dire que probablement que j'exterminerais lerepo GitHub parce qu'il semble rien contenir autre qu'en lisez-moi. Je recréerais en nouveau et
00:25:24 :je redéfinirais les... si tu crées en nouveau avec le même nom, tu n'auras même pas besoin deredéfinir le remote. Et puis il repartira de zéro sur Git. Ça c'est éventuellement le plus simple.
00:25:40 :Pas très compliqué mais quand on n'a jamais fait, comme je disais, c'est un petit peu chaud audébut. C'est de se dire ok on va merger, on va gérer les conflits. On va apprendre à gérer des
00:25:54 :conflits pour le faire une fois. Et puis là comme il n'y a qu'un fichier lisez-moi, il n'y aura pasvraiment beaucoup de conflits à gérer. Je ne comprends pas pourquoi on avait ce rebase,
00:26:09 :parce qu'il n'y a aucune raison d'avoir un rebase. Oui ça c'était bizarre. Après effectivement jesuis d'avis aussi que vu que tu as juste sur ton dépôt distant, tu as un seul commit et tu as unfichier donc tu ne perds pas grand chose. L'important là ce serait de faire un premier
00:26:28 :commit initial avec le code que tu as actuellement. Bien aussi faire le Gitignore parce que là tu aspas mal de bruit entre le venv, le fichier de database que tu n'as pas forcément envie d'incluresur Git. Donc ouais moi à la limite je ne sais pas, là si tu fais un Git log...
00:26:53 :Ok ouais c'est ça, tu as quand même déjà pas mal de... enfin là pour le coup tu as unhistoric local. Donc ouais effectivement moi je supprimerais, comme disait Thierry, le dépôt distant
00:27:13 :vu qu'il n'y a rien, tu aurais intérêt à recréer un nouveau dépôt. Si tu l'appelles de la mêmefaçon effectivement ton URL sera la bonne. Si jamais tu crées avec un autre nom, il faudra
00:27:29 :changer l'URL du remote, donc ça c'est git remote set URL, un truc comme ça. Et là du coup tu vaspouvoir lui dire en fait de suivre un autre dépôt sur GitHub. Le plus simple effectivement c'est de
00:27:46 :l'appeler de la même façon comme ça tu seras déjà bien bien setupé. Et après avec ça tu peux faireun fichier, un.gitignore. Tu peux ajouter dans le.gitignore le dossier venv, le dossier
00:28:02 :database, et puis après faire un git add de tes fichiers. Alors là effectivement je crois que surle discord tu peux au début, mais je suis d'accord là aussi avec Thierry, il faut toujours mieuxprivilégier le git add en spécifiant précisément ce que tu veux. Et je viens de voir que tu avais
00:28:19 :déjà le gitignore donc ça c'est bien. Donc après tu fais un git add avec les fichiers que tu veuxajouter, donc il vaut mieux y aller précisément pour pas ajouter des trucs justement. S'ils sont
00:28:29 :pas dans le gitignore tu risques d'ajouter des choses que tu voudrais pas, donc d'ajouterprécisément ce que tu veux. Et après tu fais un git commit, un premier commit avec tes fichiers.
00:28:38 :C'est pas uniquement pour pas... quand tu fais un git add avec des fichiers que tu veux ajouter,uniquement, c'est pas seulement pour pas ajouter des choses que tu voudrais pas, mais souvent quandtu fais des commits, tu voudrais avoir des commits qui sont aussi atomiques que possible,puis tu voudrais committer par exemple les changements faits sur un fichier, puis après
00:29:01 :un deuxième commit sur un autre, et pas forcément tous les fichiers que t'as touchés en même tempssur une sorte de save global. C'est petit à petit quelque chose que tu vas finalement découvrir,
00:29:15 :que plus tu fais des commits qui ont un objectif précis, plus ce sera facile pour toi de reveniren arrière si tu as fait des bêtises. D'accord. Ok. Donc du coup là je... je souffre de...
00:29:32 :alors sur ton navigateur... donc lui... c'est dans settings... alors là oui il est en...je l'ai jamais vu en français donc... mais je crois que pour l'instant t'es pas connecté,
00:30:03 :donc t'es pas... il faut d'identifier d'abord. Ah alors attend c'est bizarre ça. Il fautidentifier... c'est bizarre que je sois pas identifié... alors un peu je me rappelle plus
00:30:23 :de mes postes bien sûr. Ce que t'as d'habitude c'est là dessus que je me connecte. Pourquoije peux pas y aller là dessus? Il est où lui? Ah il est là. Et là normalement je suis connecté.
00:30:33 :Voilà là je suis connecté. Ouais et là du coup c'est dans settings, le dernier anglais à droite.Et puis tu descends tout en bas, t'as un truc rouge, et l'init repository quand tu vas cliquerdessus il va te demander d'écrire le nom du repo pour être sûr que c'est bien ce que
00:30:54 :tu veux faire. Celui là? Ouais. Donc là tu vas devoir écrire ton nom slash projet 4.Mets la majuscule, il va pas te laisser sinon. Faut vraiment que ce soit... Maintenant tu peux
00:31:27 :recréer un repo dans new, avec le bouton new là. Et là tu l'appelles exactement la même chose,projet 4 en minuscule. Projet 4, public, tu le laisses vide, donc pas de rythme, rien,
00:31:44 :créez votre repository. Là il est bon. Là le remote t'as pas besoin de le créer, t'as justebesoin de copier la dernière ligne qui te pousse celle là. Mais celle là il faudra que tu l'exécutes
00:31:59 :uniquement lorsque tu auras fait les commits que tu désires faire. Donc du coup, comment je sors?Là tu appuies sur Q, ça va sortir du log. Donc là, si je comprends bien, je fais un git... Là
00:32:29 :même maintenant tu dois pouvoir copier cette ligne, normalement même si t'as pas tout commité,ça devrait partir. Donc voilà. Tu peux vérifier que maintenant sur ton repo tu as bien ton code
00:32:50 :actuel. Il faut juste rafraîchir. Et là les deux sont dans le même état puisque tu viens detoucher ton code, donc à cet instant précis, ton dépôt local et le dépôt sur github sontexactement pareils. Et après c'est là où en fait, quand tu vas commencer à faire des modifications
00:33:16 :locales, les deux vont diverger et c'est là que tu vas donc dire je souhaite ajouter tel fichier. Età chaque fichier que tu modifies, en fait quand tu fais un git status, ils vont devenir rouges. Et
00:33:30 :c'est ce que disait Thierry aussi sur l'atomicité des commits, c'est que t'es pas obligé à chaquefois d'ajouter tous les fichiers. Tu peux faire des modifications sur trois fichiers différents,
00:33:38 :qui n'ont pas forcément rapport l'un avec l'autre, et du coup tu peux dire bon bah t'asmodifié par exemple player, round et tournament, donc t'as rajouté des fonctionnalités sur tonjoueur, t'as rajouté des fonctionnalités sur le tournoi, t'as fait tout ça en même temps,et à un moment tu te dis bon bah je veux enregistrer les changements, et c'est là où il vaut mieux
00:33:58 :donc ajouter juste le fichier player, faire un commit pour dire j'ai modifié des trucs sur leplayer, et après ajouter le tournament et dire j'ai modifié des trucs sur le tournoi. Ça permet
00:34:10 :comme ça si jamais t'as un bug mais que du côté du tournoi, tu peux facilement défaire un seuldes commits, alors que si tu commits tout d'un coup à la fois le joueur et le tournoi, le problèmec'est que si t'as créé un bug dans le tournoi et que t'as mis le player et le tournoi dans le même
00:34:28 :commit et que tu défais le commit, ça va défaire les deux fonctionnalités que t'as créées. Doncc'est vraiment ça l'importance de faire des commits qui sont ce qu'on appelle atomiques,donc avec le moins de trucs différents si tu veux possibles dans le même commit. Et après une fois
00:34:49 :qu'effectivement s'il n'y a pas de problème qui se passe, tu vois le workflow habituel esteffectivement assez simple, c'est à dire que tu vas avoir git add pour ajouter des fichiers quetu veux mettre dans ton commit, git commit pour faire le message de commit, donc pour dire voilà
00:35:05 :avec les fichiers que tu as ajoutés tu vas dire j'ai fait ceci, et après tu fais un git push pourenvoyer tes changements qui sont actuellement locaux sur le dépôt distant sur git hub. Et
00:35:18 :voilà. Et généralement si tu es tout seul vraiment c'est le seul truc, tu n'as même pas besoin defaire un git pull quand tu es tout seul parce que tu es le seul à nourrir si tu veux le dépôt distant.
00:35:28 :Là où tu vas avoir besoin de faire un git pull, c'est imaginez que vous êtes plusieurs sur leprojet, il faut que tu te mettes à jour par rapport à ce que les autres ont fait. Donc tu vas avoir
00:35:38 :en fait le dépôt distant sur git hub qui va être le dépôt dans lequel tout le monde va faire desgit push, donc toi tu vas ajouter une fonctionnalité, tu as un collègue qui va ajouter une autrefonctionnalité, et à chaque fois c'est là qu'il faut faire des git pull. Donc tu arrives le matin,
00:35:51 :ton collègue il a travaillé la nuit, donc tu fais un git pull pour récupérer les changements qu'il afait pour que tu sois à jour avec son code. Parce que le problème c'est que si tu fais pas ça,
00:36:00 :tu vas continuer de travailler sur une version du code qui n'est pas à jour avec ton collègue,et là c'est les problèmes qui commencent. Donc voilà pour résumer un peu l'idée,
00:36:13 :le workflow, et après effectivement quand tu es tout seul, sur le dépôt de docstring par exemple,je ne sais plus combien de commits, je suis presque à 2000 commits ou plus, je ne sais plus,et depuis le début je suis tout seul, donc j'ai une branche main, je crois que je l'ai renommée,
00:36:31 :je me souviens peut-être encore, master, des fois je fais quelques petites branches à côté,et puis comme je suis tout seul dessus, les commandes restent très simples, il n'y a riende vraiment très compliqué. Là où ça devient le plus compliqué souvent c'est quand tu fais des
00:36:47 :gros changements et que tu peux avoir effectivement, tu es parti sur une branche et tu as pas mal dechangements et tu as oublié des fois de récupérer des trucs, et là tu peux avoir des conflits,et là effectivement ça peut devenir un peu plus compliqué, mais ça tu le vois généralement un
00:37:00 :peu plus tard. Voilà pour Geat. J'ai pas eu trop besoin d'aller super méga loin avec Geat,parce que moi aussi je suis un petit peu en mode solo sur ce que je fais, et jusqu'à présent,j'ai vu des trucs un peu plus, genre comment on fait un merge et tout ça, comment modifier son
00:37:34 :code en fonction de ce qu'on a récupéré et tout, mais je suis pas allé jusque là, parce que bon,je travaille pas avec une équipe et tout ça, je travaille pas avec des collègues ou quoi que cesoit, et du coup, pareil, je fais juste une seule branche de test, et comme ça tout ce que je fais,
00:37:58 :je le fais sur ma branche de test, ensuite après, une fois que je l'ai fait, je fais un commit,un push pour envoyer mon travail sur mon repo, mais sur ma branche de test, et ensuite,une fois que j'ai fait mon push, que j'ai poussé mon projet sur mon Github, je vais sur mon Github,
00:38:25 :et il me propose de faire un pull request, de mettre à jour la branche main,avec ce que j'ai modifié dans la branche test, comme ça la branche main va récupérer leschangements que j'ai fait sur la branche de test. Ouais, et ce qu'il faut comprendre aussi,
00:38:51 :c'est que tout ça, je trouve un peu mélangeant des fois, et qui n'est pas tout le temps bienexpliqué dans les tutos, et c'est un des trucs sur lequel je me tape la tête un petit peu en cemoment pour voir comment l'aborder, comment bien séparer les choses, c'est qu'il faut bien
00:39:08 :comprendre les aspects qui sont spécifiques aux dépôts en ligne, donc que ce soit Github,Bitbucket ou peu importe, et le fait qu'on peut aussi faire tout en local en fait. Là actuellement,
00:39:22 :si tu as une seule branche, et que tu es tout seul sur le projet, le dépôt distance,ça agit principalement comme un backup, c'est que quand tu pushes ton code, ton code va êtredispo, enfin il va être en ligne sur Github, il va être hébergé ailleurs, donc ça peut être
00:39:42 :pratique parce que si jamais ton ordi prend feu ou tu te le fais voler, ton code il est sauvegardéquelque part si tu veux. Mais à ce niveau là, tu vois, ça pourrait être, ça serait quasiment
00:39:53 :identique de prendre tout ton dossier, puis de le sauvegarder sur un Google Drive, et d'avoirune synchronisation entre les deux. Quand tu es tout seul, ça revient à peu près à ça si tu veux,
00:40:03 :il n'y a pas vraiment de grosses différences. Et après tu peux effectivement travailler 100% localet utiliser après Git, vraiment même si tu es tout seul, sans utiliser tout ce qui est, on va dire,un peu gestion de projet, donc avoir plusieurs personnes qui travaillent sur le même projet,
00:40:21 :puis donc avoir différentes branches, faire des merges etc. Tu peux également aussi t'en serviruniquement un peu comme un système de backup on va dire, mais de backup, enfin de versionningplutôt, donc juste qui te permet de revenir en arrière si jamais tu as des problèmes ou quetu veux, tout simplement revenir en arrière. Donc l'étape suivante est un petit peu celle
00:40:48 :qui a été discutée maintenant, la deuxième branche test. Avec les branches, c'est vraimentla fonctionnalité la plus sexy de Git, donc ça vaut vraiment la peine d'un deuxième temps,de voir comment fonctionne ce concept de branches, et de tout mettre sur une branche test, ça sembleune bonne idée au départ, mais ce qu'on voit c'est que quand on débute, finalement d'avoir
00:41:20 :une branche test et une branche main, c'est pas le plus facile. C'est presque plus facile d'avoirune branche à chaque fois que je commence une fonction, ou à chaque fois que je commence uneclasse, ou à chaque fois que je commence une nouvelle fonctionnalité, de créer une branche,c'est une bonne chose, parce que si je me perds un petit peu, surtout au départ de ma fonctionnalité,
00:41:42 :si je sais pas où je suis, si j'ai expérimenté des choses mais que ça n'a pas été concluant,et puis que je sais plus trop comment revenir en arrière, j'ai toujours la possibilité de revenirsur la branche main, voire de supprimer carrément ma branche de features et puis d'en créer une.
00:41:59 :Tandis que si j'ai une branche de test où je fais tous mes développements de tests,je vais commencer à devoir apprendre à comment revenir dans commit en arrière,et là c'est tout de suite un petit peu plus technique. Et même au niveau justement de,
00:42:12 :ça c'est un truc dont je vois beaucoup de gens s'en rendre compte par eux-mêmes sur le moment,parce que ce que je trouve c'est pas assez expliqué dans les tutos, c'est l'idée que là encore quandvous êtes tout seul, une branche ça permet notamment, je vais encore prendre l'exemple de
00:42:30 :Dockstring, on a toujours l'impression que notre application fonctionne à merveille,donc vous avez votre code sur la branche main, master, et on se dit bon bah voilà sur cettebranche là ça marche, et vous commencez le développement sur cette branche, donc vousrajoutez des fonctionnalités, des trucs qui vont vous prendre un jour ou deux de développement,
00:42:49 :et qui sont très, du coup qui évoluent pendant ces deux jours, et qu'il faut vraiment arriver à lafin de ces deux jours pour avoir un truc qui marche, et pour pouvoir ensuite faire un release.
00:42:59 :Le problème c'est que, ce qui arrive bien souvent, c'est qu'il y a un bug dont vous n'étiez pas aucourant qui se manifeste, et là du coup si vous avez fait ce développement sur votre branche main,bah là vous devez fixer le bug sur la branche main que vous n'aviez pas vu, et vous avez déjà
00:43:19 :commencé à faire des modifications sur plein de fichiers, et donc vous allez commencer à corrigerle bug, et peut-être que justement, alors soit ça va tout être dans le même fichier, alors il y amoyen d'ajouter, de faire des commits juste sur certaines parties de fichiers, mais là ça devient
00:43:34 :assez compliqué, et même le risque c'est que, comme on l'a vu avec le git add, c'est que vousvous fassiez un git add de tous les fichiers, et que en même temps que vous corrigez le bug,et bien vous ajoutiez le bout de fonctionnalité que vous étiez en train de coder, et que du coup
00:43:51 :vous faites un release, alors le bug est fixé, mais en même temps vous avez poussé un bout defonctionnalité qui n'est pas terminé, et qui peut-être fait planter le site. Donc là, c'est
00:44:02 :pour ça que d'avoir aussi, dès le départ, de séparer sur une branche, de se dire bon ben là jeteste un truc, donc je pars sur une autre branche, et si jamais il y a un bug, vous pouvez faire unebranche pour le bug, le fixer, et ça permet vraiment de séparer les choses. Est-ce qu'il y
00:44:23 :avait d'autres questions un peu pour git, ou je peux vous montrer les imports circulaires? Uneautre joyeuseté. J'ai d'ailleurs, ça aussi les imports circulaires, c'est un truc assez intéressant
00:44:43 :à expliquer, en essayant de trouver des façons de l'expliquer, je me suis rendu compte qu'ilfaudrait que j'en fasse une vidéo, parce que c'est... je vais vous montrer ce que j'ai préparé,
00:44:58 :et je vais devoir encore retravailler, parce que je pense qu'il y a moyen de le montrer avec desexemples très simples. J'ai essayé de faire un exemple un peu plus... comment dire... viréel,
00:45:11 :de ce qu'on pourrait faire, et ce qui pourrait aussi causer, dans la logique, parce que c'estsouvent la logique en fait qui est déficiente, et qui crée des imports circulaires, c'est à direqu'on va... c'est pas une surprise d'ailleurs que ça arrive dès le moment où on commence à séparer
00:45:27 :notre code en plusieurs modules, et qu'on n'a pas encore acquis ces réflexes de comment séparer lecode, de où mettre les fonctions, on commence à séparer le code en même temps qu'on crée leprojet, qu'on réfléchit, qu'on apprend, et c'est là qu'on se retrouve avec des imports circulaires,parce que voilà, on n'a pas cette logique d'organisation. Donc je vais vous partager
00:45:46 :mon écran, et je crois qu'il va falloir que je redémarre mon Chrome, parce que... alorsChrome tab, Windows, je vais partager celui là. Ouais c'est ça, bon alors je vais revenir, parce
00:45:59 :qu'il veut pas... avec les updates, donc je reviens dans deux minutes. Alors, vous m'entendez toujours?Oui? Ok, super. Vous voyez mon écran aussi? Oui. Je suis repassé à 27 pouces, là c'est vraiment...
00:46:23 :ça fait cinq mois que je suis avec le Macbook 16 pouces, là je sais plus quoi faire de tout cetespace, il y a trop trop d'espaces partout. Alors, donc je vous ai fait un petit exemple avec des
00:46:36 :fonctions assez simples, mais qui sont quand même des fonctions... j'avais commencé des exemples avecdes fichiers A.py, B.py, et tout ça, et je me suis dit que j'allais finalement faire un exemple un
00:46:47 :peu plus concret. Donc là on a deux fichiers qui sont justement des fichiers un peu utilitaires,et justement j'en ai fait un qui s'appelle Utils.py, et j'en ai fait un que j'ai appelé Converter.py,
00:47:00 :donc ça c'est... voilà je me suis dit ça pourrait être un cas de figure où on commence par faire unfichier converter parce qu'on se dit voilà j'ai pas mal de fonctions qui vont me servir à convertirdes données d'un type à un autre, donc là par exemple convertir des données RGB en hexadécimales,
00:47:15 :donc pour changer des couleurs, et on pourrait se dire voilà j'ai un fichier Utils qui est des trucsun peu plus génériques avec par exemple ici pour... toujours avec des trucs de couleurs, mais voilà là
00:47:26 :c'est pas forcément une idée de conversion, là par exemple on a un check if color is black,là on a un utilitaire pour séparer à partir d'une chaîne de caractère RGB les différentes valeursRGB sur la virgule, donc voilà c'est des exemples très simples, mais voilà je me suis dit c'est le
00:47:43 :genre de choses qui peut arriver, on commence à séparer les choses en différents fichiers,et surtout quand on commence à avoir des fonctions un petit peu utilitaires comme ça,on a tendance à commencer à les utiliser un peu partout, et notamment à créer donc ce qu'onappelle du couplage, c'est à dire d'avoir des fonctions qui appellent d'autres fonctions,
00:47:59 :et avoir plein de choses qui sont un peu emmêlées les unes dans les autres, et c'est là qu'on peutse retrouver avec des problématiques d'import circulaire, parce que on va avoir des fonctionsqui sont dans différents fichiers et qui s'appellent les unes les autres, et donc on va se retrouver
00:48:12 :avec ces deux imports par exemple ici, et on va avoir donc depuis le module Utils l'import decette fonction qu'on utilise ici, puisque là en fait ce que j'ai fait c'est encore un exempleassez bête, c'est de se dire bon imaginons que on est en développant, on se dit bon bah ça serait
00:48:29 :bien de pouvoir utiliser cette fonction en passant directement une chaîne de caractère, donc enpassant par exemple 255 0 0 et non pas en l'utilisant comme elle est censée être utilisée, donc c'estpas forcément une bonne chose à faire, c'est pas du beau code de faire ça, de faire des ifs,
00:48:46 :instants etc, en pensant que, en se disant ça va être plus simple parce que comme ça l'utilisateurpourra avoir plus de flexibilité, il vaut mieux généralement forcer un peu les choses et leverdes erreurs dans le cas où on n'a pas les bons paramètres plutôt que de faire des trucs un peu
00:49:01 :trop versatiles. Donc là voilà on se dit on a envie de permettre à l'utilisateur de convertir le rgben hexadécimal en passant une chaîne de caractère ou en passant, je vais rester constant ici avecles mêmes nombres, ou en passant les valeurs de façon séparée. Et là on se dit c'est bien parce
00:49:19 :que j'ai créé une fonction split rgb from string donc ça me permet de l'utiliser pour séparerces valeurs, donc cette chaîne de caractère en différentes valeurs, donc je vais l'utiliser.
00:49:28 :Donc c'est pour ça qu'on utilise depuis le utils, on importe cette fonction. Et à l'inverse depuisle utils on a un peu le même cas de figure, on a une fonction qui veut vérifier si la couleurest black, donc on passe une chaîne de caractère rgb et on se dit comment est-ce qu'on peut
00:49:47 :savoir si une couleur est noire, et là la personne qui développe l'application elle sait qu'enhexadécimal le noir c'est 000000. Et donc là il dit voilà c'est bien j'ai une fonction convert rgb
00:50:00 :to hex donc je vais l'utiliser et donc là hop on repart dans l'autre sens, on utilise depuisconverter la fonction qui est ici et là je pense que vous commencez à avoir un petit peu l'idéed'import circulaire, c'est que du coup depuis utils on importe une fonction et depuis converter
00:50:13 :on importe une autre fonction. Ça va jusque là? Oui, qui me dit mot consent, ça devrait aller?Ok, en fait je vais vous montrer, je vais lancer le code et vous allez voir le problème, là c'étaitjuste l'intro, essayez pas de comprendre tout ce qui se passe ici, du type in, tout ça,
00:50:40 :l'important c'est pas de comprendre précisément ce qui se passe dans les fonctions, l'importantc'est de comprendre comment on va pouvoir régler le problème, ce qu'il faut juste comprendre làdedans au delà des fonctions elles-mêmes qui n'ont pas vraiment d'importance, c'est justeque depuis le module converter.py on importe une fonction qui est dans utils, ok, et depuis utils
00:51:00 :on importe une fonction qui est dans converter. Ok, ça c'est clair? D'accord, donc maintenant sije lance converter, on se retrouve avec cette erreur, donc l'erreur et on voit le circulaireimport ici, donc cannot import name split rgb from string depuis un module qui est partiellementinitialisé, donc le module utils, et ça nous indique donc que c'est probablement dû à une
00:51:28 :erreur d'import circulaire. Vous en faites pas aussi là, c'est quand même, c'est Loïc qui avaitposé cette question parce qu'il était dans cette partie, soyez pas paniqués si vous ne comprenezpas tout ça, comme je vous disais vous pourrez y revenir dans deux mois quand vous aurez cesproblématiques, là on est quand même dans des concepts un petit peu plus avancés et aussi pour
00:51:44 :expliquer un peu plus en détail ce qui se passe, on va aller un petit peu sous le capot de qu'estce qui se passe quand on importe des modules, donc ça se peut que vous soyez un peu perduset paniqués, mais vous en faites pas, on rentre dans des trucs un peu plus avancés. Et d'ailleurs
00:51:59 :Thierry n'hésite pas à me corriger parce que ça se peut qu'il y ait des précisions à apporter surtout ce que je vais dire. Donc là on... Vidéo à partir de A et de B.P pour Loïc si jamais t'as
00:52:12 :besoin d'une vidéo. Ah ouais bon bah voilà écoute on pourra comparer nos façons de faire parce quec'est vrai que c'est... là je vais montrer un peu ce qui se passe quand on importe un module et
00:52:21 :concrètement parce que je regardais justement comment les gens expliquaient ça et je trouveque en gros la solution qu'ils vous donnent c'est juste d'enlever le from et puis de faire un importmais je trouve qu'ils expliquent pas forcément pourquoi ça règle le problème donc je vaisessayer de vous expliquer un peu, je vais vous montrer différentes façons de régler le problème
00:52:38 :et après on va aller un petit peu sous le capot. Donc là qu'est ce qui se passe, c'est effectivementce côté ping pong c'est à dire que quand on va lancer le script converter.py, il exécute cette
00:52:49 :ligne, il se dit ok donc depuis le module utils je dois importer cette fonction. Il arrive dans lemodule utils puisque pour importer cette fonction en fait et c'est ça qu'on va voir après il fautqu'il importe le module utils et quand il importe le module utils là on fait la même chose dans le
00:53:02 :sens inverse c'est à dire que dans le module utils on importe converter rgb2x donc il va dire okdonc il faut que j'importe converter donc il revient là et là il dit bah dans converter fautque j'importe utils et c'est là qu'on a le partially initialized et si on remonte le traceback
00:53:21 :ici on voit qu'on commence avec cette ligne from utils import split rgb from string ensuite onarrive à cette ligne donc from converter import rgb2x et ensuite on revient à from utils importsplit rgb2x. Donc vous voyez qu'on a cette idée un peu de circulaire de récursivité qui cause
00:53:38 :problème. Donc qu'est ce qu'on peut faire? La première chose qu'on peut faire c'est déplacer l'importà un autre endroit. On peut se dire bon bah cet import en fait il faudrait l'enlever il faudrait
00:53:49 :tout simplement si j'enlève cet import ici je règle le problème de base parce que là on veutimporter cette cette fonction donc split rgb from string là on arrive dans ce module et là onimporte plus on n'a plus besoin d'importer converter. Donc là on règle le problème si je
00:54:04 :réexécute le script il n'y a plus d'erreur. Par contre on aura une erreur si jamais on essaied'utiliser check if color is black parce que là vous voyez il me surligne en dessous puisque ilsait plus il sait pas qu'est ce que c'est convert rgb2x donc là il faudrait déplacer l'import il
00:54:18 :faudrait conserver l'import mais le déplacer ici par exemple. Donc dire que on veut juste importerla fonction convert rgb2x quand on va appeler cette fonction ici. Donc là ça permet de garder
00:54:31 :cette fonction utilisable et de ne pas avoir l'import directement au niveau donc dans l'espaceglobal du module utils. C'est une façon de faire qui n'est pas forcément déconseillée par Python,
00:54:45 :si vous allez lire la documentation on conseille généralement de mettre tous les imports au débutdu script après même aussi des fois pour des raisons de performance ça peut être intéressantde mettre des imports directement précisément aux endroits où on en a besoin. Généralement c'est
00:55:02 :quand même assez rare, là encore si on pense bien à notre code on a généralement assez peu besoinde le faire mais c'est quand même possible dans certains cas de figure très spécifiques. Le
00:55:13 :problème qu'on a actuellement aussi c'est que imaginez que cette fonction convert rgb2x onl'utilise dans 15 autres fonctions à l'intérieur de utils.py, le problème qu'on va avoir c'est
00:55:22 :qu'on va répéter le from converter import convert rgb2x dans toutes les fonctions dans lesquelleson en a besoin. Donc vous voyez que là ça peut devenir une solution qui n'est pas très efficace
00:55:33 :parce qu'on va dupliquer cette ligne d'import à plein d'endroits différents donc à l'intérieurdes différentes fonctions. C'est pas trop un problème ça, parce que cette ligne elle prend
00:55:42 :du temps la toute première fois qu'elle est exécutée et puis elle prend pratiquement pas detemps après parce qu'en module elle n'est exécutée qu'une seule fois. Le problème c'est que tu vas
00:55:51 :répéter la ligne donc si jamais tu changes le nom de la fonction par exemple ou du module il fautfaire du... C'est sûr qu'en termes de maintenance... Oui c'est ça, c'est l'idée de... c'est pas très
00:56:02 :dry donc on se répète beaucoup. Après effectivement au niveau performance ça n'est pas très problématiquepuisqu'on va le voir effectivement quand on importe un module même si vous le réimportez après ilest entre guillemets en cache puisque Python va savoir en fait que le module a déjà été importé
00:56:18 :donc il va pas le réimporter une deuxième fois. Donc la deuxième chose qu'on peut faire c'est toutsimplement justement revoir notre code. Là on a commencé avec un code où on a fait un module
00:56:28 :converter.py, on a fait un module utils et peut-être qu'au bout d'un moment on se dit en faittout ça c'est des utilitaires ou tout ça c'est des fonctions de conversion l'un ou l'autremais on peut se dire est-ce que j'ai vraiment besoin de deux fichiers qui font un peu la même
00:56:42 :chose et donc là on peut se dire je vais tout mettre dans le fichier utils donc on prend cequ'on a dans le converter, on supprime le module et on met tout dans utils. C'est aussi une façon
00:56:51 :de faire qui est plus au niveau justement là encore de l'organisation qui a le désavantagedu coup de comment dire ça un petit peu une façon détournée de faire parce que des fois je vois desgens justement qui se disent ça, qui ont une raison de séparer les choses en plusieurs fichiers parce
00:57:06 :que effectivement les fonctions font pas les mêmes choses et vous commencez à avoir un fichier quifait 1500 lignes donc là ça peut être une bonne raison de commencer à séparer leschoses et finalement il commence à avoir des imports circulaires donc du coup ils reviennent àun gros fichier où il y a tout dedans pour éviter ces problèmes d'import circulaire. Donc si vous
00:57:24 :faites ça dans ce sens là c'est pas forcément voilà c'est une façon de résoudre le problèmec'est pas forcément la meilleure façon de le résoudre mais si finalement vous voyez qu'auniveau de la logique il y a une raison de tout rassembler dans un seul fichier parce que vous
00:57:36 :avez voilà trois fonctions d'un côté cinq de l'autre et tout ça peut être remis dans un seulfichier ça peut être une façon de faire également. Ça va jusque là? Oui comme je vous disais c'est
00:57:51 :un peu une vidéo de référence et j'en ferai une j'ai prévu du coup d'en faire une sur docstringou youtube enfin vu que ça risque d'être une vidéo que je veux assez efficace qui dureraprobablement une dizaine de minutes peut-être que ce sera sur youtube je pense pas qu'il y
00:58:06 :ait besoin de faire une formation complète en plusieurs parties là dessus c'est plus un genrede truc voilà erreur courante et comment les éviter. Donc la dernière façon de faire c'est
00:58:17 :de tout simplement faire au lieu de faire from converter import convert rgb2x de faire importconverter comme ça et ensuite du coup ici d'utiliser le nom du module donc converter.convertrgb2x
00:58:29 :et là pareil on enlève ça et on fait import utils ici on fait utils.splitrgbfromstring.Ça a l'avantage aussi d'avoir un code qui est plus explicite parce que là on sait clairementd'où vient cette fonction bon là on n'a pas grand chose dans notre fichier mais imaginez que vousayez plein d'autres fonctions si on n'a pas le utils devant bah là on sait pas trop où est ce
00:58:52 :qu'elle est définie cette fonction il faut retourner au niveau de l'import pour voir qu'elle est définiedans le utils et qu'on l'importe directement depuis ce module utils. En mettant donc le namespace donc
00:59:02 :le nom du module devant bah on comprend directement que cette fonction vient d'ici donc on a un codequi est plus explicite. Le désavantage après c'est que si vous commencez à avoir des niveaux donc des
00:59:11 :packages qui contiennent des modules qui contiennent des sous modules etc vous pouvez avoir des nomsqui sont un petit peu à rallonge et après personnellement je préfère grandement avoirdes noms à rallonge et des choses explicites plutôt que de toujours un peu jouer à la devinette et degagner quelques microsecondes vu qu'avec les autocomplétions des éditeurs généralement ça
00:59:32 :va très vite de taper ces choses là. Si utile c'est des uns package ce sera simplement from packageimport utils donc ça change pas grand chose. Oui oui c'est ça et justement ça m'amène au deuxième
00:59:45 :point un peu c'est que en fait parce que on a l'impression que ce qui règle le problème icic'est de passer du from utils import à import utils. C'est pas exactement ça en fait la différence
01:00:01 :ici entre les deux c'est pas tant le fait qu'on importe depuis donc avec from et que ici on importele module directement c'est pas la syntaxe en tant que telle si vous voulez c'est plus qu'est cequ'on importe. Ici on importe un objet qui est contenu dans le module utils alors que ici on
01:00:19 :importe le module au complet. Et en fait ça fait pas la même chose et c'est là que ça va rentrerun petit peu plus dans le détail c'est que ces deux lignes là ça produit pas le même résultat.
01:00:31 :Qu'est ce qui se passe quand on fait from utils import split rgb from string? Alors là on vautiliser quelques fonctions on va utiliser la fonction locales et on va utiliser le module 6 et onva faire un print de 6.modules. Je vais essayer de rester clair parce que c'est là que ça devient un
01:00:53 :petit peu plus compliqué. Donc quand on fait ça et je vais enlever l'import aussi pour pasavoir d'erreur donc l'import circulaire. Là j'ai enlevé donc commenter la ligne pour ne pas avoir
01:01:05 :l'import et on va juste importer la fonction. Donc je relance ce fichier et là on a plein de trucsdedans. Qu'est ce que j'ai printé au début? J'ai printé locales donc locales on va essayer de
01:01:17 :... donc les locales c'est ça et 6.modules c'est ça ici. Donc qu'est ce que c'est que tous cestrucs? Alors locales en fait c'est tous les noms qui sont disponibles dans l'espace local donc là
01:01:31 :l'espace local c'est l'espace global on pourrait aussi utiliser global dans ce cas ci puisquec'est la même chose. Locales ça va afficher en fait tout ce qui est disponible dans l'espace
01:01:39 :local donc là comme on le fait au premier niveau d'indentation si vous voulez donc directementdans le fichier converter.py, pas à l'intérieur d'une fonction mais directement dans le module,
01:01:49 :ça va me montrer en fait tout ce que je peux utiliser directement ici. Donc c'est à direque toutes ces choses là ici, name, doc, package, built-ins, je peux les utiliser donc je pourraisfaire un print de name et ça va fonctionner. Je pourrais faire un print de package aussi et ça
01:02:07 :va fonctionner. Et donc je peux faire un print ou une utilisation, je dis un print ici mais çapeut être juste l'utiliser donc là dans ce cas ci je pourrais utiliser rgb2x puisque elle estdéfinie ici. Et je peux aussi définir, utiliser split rgb from string parce qu'elle est définie ici.
01:02:24 :Donc le fait en fait d'avoir fait from utils import split rgb from string, ça va mettre enfait cette fonction dans l'espace du script donc l'espace local ici pour me permettre de l'utiliser.
01:02:37 :Mais ça fait pas que ça, ça va aussi en fait importer, si je reviens ici tout en bas je croisque je l'ai vu, voilà ici vous voyez il y a utils. Donc là le module utils il a été chargé, il est
01:02:52 :dans 6.modules donc ça veut dire qu'il a été chargé. Par contre je peux pas l'utiliser, c'estlà où c'est un petit peu surprenant au début parce que si on revient voir tout en haut danslocales, donc dans locales ici, si on regarde toutes les clés qu'on a ici, on n'a pas utils.
01:03:06 :Donc ça veut dire ici que si je fais utils. je vais avoir une erreur, il va me dire utils jesais pas ce que c'est parce qu'il n'a pas été mis si vous voulez dans cet espace local. Mais il a
01:03:19 :quand même été importé. Et si je veux donc l'utiliser directement, si je fais import utils,par contre là je vais pouvoir utiliser utils. Parce que là ce qu'il va faire c'est qu'il va
01:03:33 :quand on fait import utils, il va importer le module et il va le mettre dans l'espace local.C'est là que je me rends compte que j'ai pas forcément bien expliqué le truc, je pars un peudans toutes les directions, vous êtes probablement un petit peu perdus, il faut que je fasse une
01:03:48 :vidéo à tête reposée là dessus pour que ce soit clair. Donc quand on fait un from, en fait cequ'il va faire c'est qu'il va importer le module et après il va vous donner accès à tout ce quevous avez mis après le quand vous faites from module import etc. Là vous pouvez en mettre
01:04:06 :plusieurs. Donc il va faire un mapping si vous voulez entre les noms que vous avez mis ici etla fonction en tant que telle. Donc là vous voyez qu'on a le nom qui est disponible et qui correspond
01:04:15 :à la fonction. Et quand vous faites import utils, il va pas faire ce mapping, il va juste importerle module, il va mettre le module dans ce locales ici donc on pourra l'utiliser mais après si vousvoulez donc utiliser cette fonction il faudra passer par le module utils. Donc faire comme ça
01:04:30 :ici utils.splitrgbfromstring. Donc pourquoi ici en fait quand on fait import utils à la place defrom utils.splitrgbfromstring ça règle le problème parce que quand on importe utils comme
01:04:47 :ça il va juste donc mettre le module, il va importer le module et il va pas avoir besoinde faire cette liaison entre le nom et la fonction et on n'aura pas un module qui estpartiellement importé. Il va pas avoir besoin d'accéder si vous voulez à cette fonction. Et
01:05:08 :c'est juste après au moment où vous allez l'utiliser qu'il va utiliser le module utils.lafonction et que là du coup tout sera chargé correctement. Je sais pas si c'était clair,
01:05:20 :je pense que vraiment je ferai une vidéo. Une petite question Thibault, pourquoi on metle from utils, pourquoi on part pas directement avec l'import et puis c'est vrai que c'estbeaucoup plus clair après dans le code. Oui c'est une façon de faire, comme je te dis il
01:05:37 :y a en fait, faut vraiment bien comprendre ici que tu pourrais, c'est ce que je disaislà au début, que c'est pas tant le from qui est un problème, c'est ce que disait Thierrytout à l'heure aussi, c'est que tu pourrais faire from package import module si tu veux.
01:05:54 :Donc là dans ce cas ci ton import importerait un module ok et donc ça reviendrait au mêmesi tu veux que de faire import package.module parce que dans les deux cas en fait t'importerais
01:06:05 :le module et pas un objet à l'intérieur du module. Ce qui cause problème là icic'est vraiment quand t'importes un objet spécifique et qu'il fait un mapping entreles deux, quand t'importes le module il va mettre la référence du module directementalors que quand t'importes l'objet il va mapper avec le from, il va mapper dans ton
01:06:22 :locales l'objet en question. Et après oui effectivement moi c'est vrai que je réfléchis,ça m'arrive quand même de faire des from machin import truc, ça c'est vraiment legenre de truc qui arrive un peu avec l'expérience, c'est vrai que ça fait un petit moment quej'ai pas eu d'import circulaire, je sais que c'est le genre de truc qu'il y a 5-6
01:06:51 :ans ça m'arrivait tout le temps et puis justement je passais par ça, je faisais unimport directement du module et par contre je me rappelle que des fois t'arrives avecdes noms assez longs, notamment des fois, surtout que des fois justement tu sais pasjusqu'où tu peux importer, par exemple dans Django il y a pas mal de packages qui
01:07:11 :sont avec des noms à rallonge et donc des fois t'as juste envie d'utiliser, t'asune petite fonction très pratique pour modifier une chaîne de caractère qui est contenueà l'intérieur d'un module qui est à plein plein plein de sous-niveaux et donc là effectivementc'est à chaque fois que tu veux modifier ta chaîne de caractère tu fais django.templates.filter.utils.slugify
01:07:35 :bah là tu peux vraiment te retrouver avec des lignes à rallonge, donc dans ces cas-ciça peut être intéressant de vraiment juste faire from django.templates.filter.truc import
01:07:45 :slugify, comme ça tu peux directement utiliser la fonction. Mais tu vois dans des cas commeceux-ci tu utilises un framework qui lui-même s'assure de pas avoir de problème d'importcirculaire, là tu vois c'est vraiment plus si toi tu commences à faire des fichiersavec des trucs qui s'appellent les uns dans les autres, c'est là que ça peut commencer
01:08:06 :à créer des problèmes. Si vraiment tu fais juste dans plusieurs fichiers faire des fromet importer des trucs d'un framework comme django, bah là normalement ça devrait pascréer de problème. Ok c'est bon. On utilise en fait un port quand on sait qu'on va utiliser
01:08:29 :pas mal de fonctionnalités qui sont dans le module, et on utilise from que si on saitqu'on va utiliser juste un module en particulier, une fonctionnalité en particulier qui appartientau module. Ouais alors après tu peux quand même, tu vois c'est ce que je disais sur
01:08:49 :le from, tu peux importer un module avec from, tu peux dire from package import module. Fautvraiment comprendre que le from ne veut pas dire que tu importes un objet spécifique,enfin je veux dire une fonction, donc tu pourrais te dire, mais je valide ton raisonnement effectivement,mais tu vois ce que je veux dire par là c'est que tu pourrais dire from, par exemple from
01:09:16 :converter import utils. Et donc là utils ça pourrait être un module qui contiendraitplein d'objets aussi. Donc même avec un from, tu vois si tu dis from mon package import un
01:09:30 :objet, bah là t'as importé un module qui contient plein d'autres trucs. Donc ça veutpas forcément dire quand t'as cette syntaxe from machin import truc, que le truc en tantque tel c'est juste une fonction, ça peut même être un package qui contient des modules,qui contient des fonctions. D'accord ok. Donc c'est pour ça que ça dépend à quel niveau
01:09:54 :tu l'importes, tu vois c'est ce que je disais, tu pourrais dire, je reprends l'exemple deDjango, sur Django tu pourrais dire bah j'importe depuis Django template filter, donc je disfrom Django point template import filter. Et dans filter tu vas avoir filter point slugify,
01:10:11 :filter point capitalize, filter point machin. Et donc là tu vois tu peux te dire je vaism'arrêter juste au niveau de filter parce que finalement si j'importe directement lesfonctions, si je dis from Django point template point filter import slugify capitalize etc,bah là tu vois tu perds cette information que c'est des filtres. Dans ton code tu vas
01:10:30 :voir directement slugify capitalize et il faut que toi tu te souviennes que c'est desoptions de filtres. Ce qui n'est pas forcément évident si t'as juste le nom des fonctions.
01:10:39 :Alors que si tu t'arrêtes au niveau au dessus, où tu dis bah je vais importer directementle module filter, je vais importer donc from Django point template import filter, bah làtu peux garder le filter point capitalize, filter point slugify et juste t'éviter d'avoirà chaque fois à faire Django point template point filter. Donc t'enlèves certains niveaux
01:11:01 :d'arborescence pour avoir un code qui est moins long à taper mais tu gardes quand mêmejuste ce qu'il faut pour que ça reste explicite. Alors que tu vois si je te disais bah oui
01:11:17 :fais toujours un import et puis fais jamais from parce que voilà juste fais le, bahlà t'aurais tendance à toujours importer Django point template point filter et du coupdevoir toujours taper Django point template point filter. Ce qui n'est pas forcément
01:11:31 :efficace après. Je vais creuser un petit peu ça parce que ouais c'est pas toujoursbon. Je vais vous faire des vidéos parce que c'est vraiment des sujets qui sont durs
01:11:44 :à expliquer en live comme ça sans perdre les gens, c'est vraiment le genre de trucoù il faut beaucoup de visuel aussi. Là quand on explique comme ça, qu'on tape du code
01:11:55 :je trouve que voilà on perd assez rapidement les gens donc je vais prévoir des vidéoslà dessus où je vais faire ça aux petits oignons et puis avec du visuel on voit bienqu'est ce qui se passe quand on import, qu'est ce qui se passe dans ces modules etc. Je vais
01:12:12 :prévoir ça pour que ce soit et que vous puissiez l'avoir en référence pour la suite.Après vous inquiétez pas c'est aussi le genre de truc, parce que je sais que le hicdu coup là quand il a eu cette erreur il se disait merde je commence à pouvoir séparer
01:12:28 :mon code, à avoir un projet un peu plus complexe et puis là je tombe dans des trucs qui fontmal à la tête et c'est un peu décourageant parce qu'on se dit merde on voit pas le boutquoi. Avant j'avais tout dans un fichier ça marchait très bien et là je commence
01:12:40 :à essayer de faire un truc plus clean et en fait je me tape des erreurs du genre oùil faut aller essayer de comprendre comment ça marche et tout. En fait c'est des problèmes
01:12:51 :qui se résolvent tout seul avec l'expérience de la conception de projet. C'est à direque vous pourriez ne pas avoir toutes ces explications que je viens de vous faire parceque naturellement en fait en créant des projets et en organisant votre code de mieux en mieuxces problèmes vont disparaître d'eux même. Et après éventuellement un moment même
01:13:15 :en organisant votre code mieux vous allez quand même des fois tomber sur des importscirculaires. Et donc là c'est intéressant de savoir comment les résoudre et de pas
01:13:24 :juste y aller au petit bonheur à la chance. Mais je vous rassure là aussi c'est vraimentle genre de truc où on voit des développeurs qui ont des fois plusieurs années d'expérienceet puis il y a des problèmes d'imports circulaires et justement ils ne les ont pas appris à
01:13:38 :les résoudre au début, ils les ont résolus par eux même du coup en apprenant petit àpetit à mieux organiser leur code et finalement cinq ans après quand ils tombent sur l'erreurparce qu'ils ont mal fait un truc finalement, ils n'ont pas quand même tout fait bien auniveau de l'organisation de leur code, là ils arrivent à la résoudre un peu comme
01:13:58 :ça en se disant bon bah j'ai vu sur internet qu'il suffisait de changer les from en import,ils changent ça partout, ça règle le problème, ils sont contents et ils peuvent repartirsur cinq ans de développement sans vraiment comprendre pourquoi le problème arrive. Et
01:14:12 :c'est là que des fois vous voyez des développeurs qui ont dix ans d'expérience qui au boutde dix ans finissent par regarder comment ça marche et par vraiment comprendre ce quise passe sous le capot. Donc voilà, ne vous inquiétez pas si au début vous y allez un
01:14:26 :peu comme ça en tâtonnant et puis que c'est juste par la suite que vous comprenez, c'estdes problèmes un peu plus complexes. C'est pareil au début je ne comprenais rien et
01:14:38 :c'est trois mois, quatre mois, cinq mois après que j'ai commencé à comprendre quelquechose. J'ai eu un peu de mal au départ, j'étais tombé dans le bain directement,
01:14:50 :j'avais plein d'informations et j'ai eu du mal à gérer toutes ces informations.C'est que maintenant que je commence un petit peu à grinder, à ranger les trucs un parun correctement et à bien cerner les concepts petit à petit. Mais sinon après au tout
01:15:12 :début j'avais vraiment du mal et je n'étais pas du tout organisé.En fait ce qui est marrant c'est que plus tu creuses, tout ça c'est très logiqueet il n'y a rien de magique et tout est relié si tu veux. Le problème c'est qu'au début
01:15:28 :en fait tu apprends plein de choses dans tous les sens. Il y en a certaines qui s'apprennenttrès facilement, que voilà tu tapes un truc ça marche. Il y en a d'autres qui sont un
01:15:36 :peu plus bizarres comme tous ces trucs là qu'on a vu. Et finalement plus tu apprendset c'est pour ça que ça prend du temps, c'est que là vous voyez quand j'ai faitun print du 6 modules, qu'est ce que c'est? C'est un dictionnaire. Et donc là en fait
01:15:52 :quand vous regardez, vous apprenez les dictionnaires et puis après vous regardez ces problèmesd'import circulaire et puis vous vous rendez compte qu'en fait comment Python il sait qu'unmodule il est déjà chargé, ben en fait c'est juste qu'il a un dictionnaire dans sa mémoirequi dit ce module il existe déjà et ce dictionnaire on peut l'utiliser, on peut le modifier.
01:16:09 :Là si je voulais supprimer l'import du module, enfin oui si je voulais défaire l'importsi vous voulez, il me suffirait de supprimer la clé dans ce 6.modules et ça suffirait.
01:16:20 :Et donc là vous commencez, vous voyez quand vous allez un peu sous le capot à vous rendrecompte que tout ça c'est des principes de base qui sont utilisés après par Pythonpour plein de choses et que quand vous avez cette connaissance vraiment sous le capotvous pouvez vraiment comprendre les concepts et faire un peu ce que vous voulez. Et c'est
01:16:36 :là que ça devient vraiment puissant et que vous ne faites pas juste répéter un trucmais vous pouvez vraiment contrôler le langage en quelque sorte. Mais c'est plein de trucs
01:16:46 :qui sont liés les uns aux autres et que votre cerveau va faire des liens avec tous ces trucs-làau fur et à mesure avec le temps. Donc c'est normal que au début quand on vous dit utilise
01:16:59 :ça et fais ça et fais ci et qu'après vous avez une erreur vous ne comprenez pas forcémentcomment la résoudre. Et c'est normal et pendant très longtemps au début vous tapez l'erreur
01:17:08 :sur Google, vous tombez sur Stack Overflow, vous trouvez le petit hack pour la résoudreet ça marche très bien et puis c'est juste plus tard quand on veut vraiment creuser qu'onva essayer de comprendre tous ces mécanismes internes.
01:17:18 :Est-ce qu'il y a d'autres questions?On attend la vidéo avec impatience. Je vais voir, là je suis effectivement surGit, sur plein de trucs, je vais voir si ça peut être fait assez rapidement, auquel casça se peut que je la sorte dans la semaine ou la semaine qui vienne, sinon ça sera probablement
01:17:47 :reporté un petit peu. Mais après oui c'est vrai que c'est le genre de truc quand Loicm'a dit qu'il avait ce problème là, très rapidement en voyant son code j'ai vu cefameux effet ping pong où tu avais un module qui apportait un autre qui apportait l'autreetc. Donc c'est très facile à dire voilà comment tu peux le fixer dans ton cas présent,
01:18:09 :enlève cette ligne, rajoute ce truc là et après effectivement quand on veut éviterces erreurs par la suite, il faut rentrer dans la logique d'organisation et ça c'estdes choses qui s'apprennent sur le long terme. Donc c'est probablement des erreurs que vous
01:18:25 :allez avoir et qui vont se résoudre par elles-mêmes plus vous allez faire de projet.Salut Christophe, à la prochaine!Salut!Bon bah du coup je sais pas Johann, Arnold si vous aviez d'autres questions sinon onpeut s'arrêter là et je vous mettrai la rediffusion du coup si jamais vous voulez
01:18:51 :revoir des choses mais après je pense que vaut mieux attendre la vidéo pour revoirça là je pense que vous allez vous allez avoir mal à la tête et vous démoralisersi vous revoyez mon explication une deuxième fois.
01:19:03 :Je viens juste de commencer donc je vais rester sur les bases.Ouais ouais ouais ouais.Je mange un petit peu de vidéos, je teste quelques trucs, j'essaye de faire les quizet les exercices, moi c'est vraiment la partie je suis encore en train de grinder quoi, entrain de tester plusieurs choses, de faire des choses parce que j'ai, ouais j'ai manqué
01:19:33 :de méthodes auparavant et c'est essentiellement mon gros souci c'est vraiment organiser, bienm'organiser, bien structurer les trucs et c'est et je sens que j'ai encore besoinde travailler sur les bases en fait, de revenir sur les concepts, sur les notions parce queje les, je maîtrise pas encore tout quoi, j'ai pas encore le truc tu vois le déclic
01:20:01 :en programmation.Mais t'as tout à fait raison de faire ça parce que tu vois je reviens sur l'exempledu dictionnaire ici, c'est que c'est fondamentaux là, les bases, les data, même il y a desgens qui vont te dire que la programmation c'est juste une organisation de données,de comment les données arrivent et sortent, tu vois, in out et du coup ouais maîtriser
01:20:24 :les données de base, maîtriser tous les concepts de base, bien les comprendre et pasjuste savoir les utiliser parce qu'on a réussi à reproduire l'exemple précis tu vois,qui était dans l'exercice mais vraiment s'approprier ces choses là, prendre l'exercice,essayer de faire autre chose, essayer des trucs, frapper des murs, tomber sur des erreurs
01:20:44 :etc.Plus tu vas tomber sur des erreurs, plus tu vas apprendre à les résoudre sur des trucsde base comme ça, plus ça va être facile après par la suite d'avoir une base trèssolide et de comprendre justement qu'est-ce qui bug quand t'as des problèmes comme ça.
01:20:57 :Donc je confirme, il faut bien passer là-dessus et c'est un peu le souci aussi qu'on voitquand il y a des gens qui veulent aller trop vite, qui au bout de deux ou trois semainessont rendus dans la programmation orientée objet, c'est qu'en fait il y a trop de choses,
01:21:16 :trop d'informations d'un coup et forcément à un moment tu peux pas comprendre la programmationorientée objet si t'as pas maîtrisé les trucs d'avant parce que c'est bâti sur toutesles bases. Et donc là tu te démoralises, tu comprends pas pourquoi tu comprends pas
01:21:31 :parce que tu dis je regarde la personne qui fait je comprends, mais moi quand je m'ymets, dès que tu sors justement un petit peu du chemin qui est tracé, tu comprendsplus. Donc c'est bien important de s'approprier tout ça.
01:21:40 :Je confirme, l'orientée objet c'est un grand... Tu penses avoir compris quand t'es sur lesfonctions, t'as compris tout ça, et quand tu penses sur l'orientée objet tu te disoh en fait je suis très loin de la chose. Mais là encore tu vois sur l'orientée objet
01:21:59 :c'est très intéressant parce que c'est là où au début tu fais ce qu'on te dit,tu mets le self, tu les classes, tu sais pas trop ce que c'est, on te parle d'objet, etj'en parlais avec Thierry récemment, c'est assez intéressant, il a une approche de parlerde l'orientée objet très tôt justement, où moi je le fais pas parce que justement
01:22:18 :je me disais en fait j'avais l'impression qu'il fallait justement aller assez loin dansl'orientée objet pour en comprendre l'intérêt et que du coup je pouvais pas le présentertrès tôt dans les formations. Et en fait lui justement il part sur une approche différente
01:22:32 :parce que finalement, vous l'avez peut-être déjà entendu, en Python tout est objet,donc effectivement dès qu'on commence avec des objets de base, donc des chaînes de caractère,des listes, des nombres, on est déjà avec de l'objet. Et donc finalement déjà amener
01:22:46 :cette idée d'objet, d'orientée objet, que tout ce qu'on manipule est des objets trèstôt, c'est pas forcément stupide quoi, c'est même peut-être une bonne façon devoir les choses, je pense que ça dépend des gens en fait, et ça permet peut-êtreaprès quand on arrive dans l'orientée objet à créer directement des objets, à comprendre
01:23:03 :que Python est bâti là-dessus, et que c'est pas juste une fonctionnalité en plus qu'onpeut utiliser, mais que c'est vraiment tout ce qu'on utilise c'est des objets. Mais là
01:23:13 :encore c'est pour ça que voilà, tu fais des, vous voyez on fait du retour en arrière,on apprend un truc, après on apprend un truc plus avancé, on se rend compte que le trucplus avancé il est basé sur ce qu'on avait appris avant, voilà c'est des légos, on
01:23:25 :construit sur une base, et voilà il y a un moment où tout ça fait du sens parce qu'onse rend compte que tout est lié quoi. Et il y a des déclics après qui se font effectivement,
01:23:34 :à certains moments. C'est tout bon du coup?Ouais c'est tout bon. Ok bah super, bah écoutez il me reste plus qu'à vous souhaiter unebonne soirée, et puis n'hésitez pas si vous avez des questions pendant la semaine,vous avez le discord ou le chat ou tous les moyens que vous connaissez pour poser vos
Aucune occurrence trouvée pour « ».