Session du 16 mars 2023 à 19h00
Programmation Orientée Objet (POO)
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
Maîtriser *args et **kwargs en Python
Explication complète des args et kwargs avec les principes d'unpacking et d'héritage et dans quelles situations on peut être amené à utiliser ces concepts.
# Le concept d'unpacking
def foo(r, g, b):
print(r, g, b)
rgb = (128, 255, 255)
foo(*rgb)
rgb = {"r": 128, "g": 255, "a": 255}
foo(**rgb)
# Exemple avec l'héritage, on utilise args et kwargs pour passer les arguments à la fonction save qui est surchargée.
class BaseModel:
def save(self, force_insert=True, update=False, using=False):
if force_insert:
print("On sauvegarde l'objet dans la base de données")
else:
print("On vérifie que l'objet peut être sauvegardé")
print("On sauvegarde l'objet dans la base de données")
class BlogPost(BaseModel):
def notify(self):
print("Un article a été publié")
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.notify()
article = BlogPost()
article.save(force_insert=False, update=True)
# Exemple avec les templates de mail de Sendinblue
"""
# Template nouvelle réponse mentorat
Salut {params.user} !
{params.from_user} a répondu à ta question
# Template nouvel article de blog
Un nouvel article {params.title} a été publié :
{params.description}
"""
# Fonction pour envoyer un mail, qui passe dans data tous les kwargs envoyé à la fonction
def send_mail(template: int, **kwargs):
requests.post("sendinblue.com/api/send", data=kwargs)
# Nouvel article de blog publié
send_mail(template=120, description="10 projets Django", title="Django")
# Nouvelle réponse
send_mail(template=119, from_user="Gab", user="Thib")
00:00:00 :Est-ce que vous m'entendez tous bien?Alors, le 16...Alors, tout le monde m'entend, ok, super. Donc, PA n'était pas disponible finalement,il est vraiment sous l'eau avec le travail. Donc, c'est moi qui prends le relais avec
00:00:41 :une petite heure d'avance comme je vous ai indiqué. Je ne sais pas si tout le mondea vu déjà... Attendez, je vérifie que l'enregistrement est bien parti. Je ne sais pas si vous avez
00:00:53 :vu un peu tous les petits changements. Désolé, ça bouge beaucoup en ce moment sur notammentla barre de navigation, j'ai un petit peu fait du ménage. Normalement d'ailleurs, ça
00:01:05 :devrait être mieux Céline, tu me disais par rapport à la sémantique HTML, il y adu ul et du li dans les liens de navigation. Et au niveau de l'accessibilité, je ne suis
00:01:18 :pas encore sûr à 200% que tout soit parfait, il manque des tags, aria, etc. Mais c'estun peu plus clean en tout cas au niveau du code que ce que j'avais avant. Du coup, il
00:01:27 :y a aussi notamment les notifications. Je ne les ai pas toutes mises encore. Il y a pourl'instant les notifs de blog, quand vous répondez à une question, je vais vous permettreaussi, je pense plus tard, si jamais vous voulez vous désinscrire d'une question spécifique,parce que pour l'instant vous êtes avertis quand il y a des gens qui répondent aux questions
00:01:49 :que vous avez posées ou aux conversations dans lesquelles vous avez participé. Maispeut-être que des fois ça pourrait être intéressant de vous désinscrire d'une conversationspécifique sans vous désinscrire de toute. Je vais pouvoir rajouter ça aussi prochainement.
00:02:05 :Je vous le dis parce que pour l'instant tout est en opt-in. Je vais vous mettre le lienpour aller activer ce qui vous intéresse. C'est dans vos préférences. Je vous mets
00:02:16 :le lien. Vous pouvez choisir à chaque fois d'activer les préférences pour avoir unenotification sur le site et aussi par email. Les deux peuvent être faites séparément
00:02:30 :pour chaque type d'annonce. Par exemple, vous pouvez choisir de recevoir pour les articlesdu blog juste une annonce par mail et pas sur le site, etc. Je vous laisse aller regarder
00:02:38 :ça de votre côté. Ce soir, Gabriel m'a parlé des ARGs et des QUARGS et c'est unequestion qui revient assez souvent. Je pense que vous soyez débutant, intermédiaire,
00:02:55 :avancé, il y a toujours des choses intéressantes à voir sur les ARGs et les QUARGS. Je nesais pas s'il y en a beaucoup ce soir qui ont déjà un petit peu exploré ce conceptet surtout tout ce qu'il y a derrière parce qu'au delà des ARGs et des QUARGS, je redirige
00:03:11 :toujours vers le glossaire pour ces deux termes. J'ai fait des glossaires assez complets là-dessus.Je vais vous donner les liens avec des exemples de codes et tout. Je ne sais pas si vous avez
00:03:25 :déjà un petit peu vu tout ça, parce que c'est ça en fait ce qui est intéressant,c'est qu'avec les ARGs et les QUARGS, il y a toujours la théorie et je pense que c'estça que tu as vu Gabriel parce que j'imagine que tu as vu les cours et tout et après entre
00:03:38 :ce qu'on voit dans la théorie avec des exemples simples et après comment on l'utilise dansla pratique, des fois il y a des cas de figure qu'on ne comprend pas forcément. Je ne sais
00:03:46 :pas si c'est là où tu en étais rendu Gab du coup.Si, excuse-moi, du coup oui. Si, en fait dans Tango on utilise beaucoup les ARGs et les
00:03:57 :QUARGS mais je ne crée rarement des sanctions moi-même en mettant ARGs et QUARGS si tu veux.C'est ce que j'ai pas trop l'occasion d'utiliser et du coup des fois je dis que ça sert vraimentdes fois. Je sais que tu peux passer plus d'arguments, il y a une variété d'arguments
00:04:15 :mais ça s'arrête là.Je vais vous montrer des exemples du coup. Alors attendez, je réorganise mon écran.The Crow j'ai déjà vu un petit peu. Ok, je vais vous montrer, alors attendez, je vais
00:04:29 :vous partager. Ok, donc je vais grossir un petit peu et je vais vous montrer justementdes exemples sur Dockstring aussi parce qu'il y en a pas mal qui sont utilisés avec Django.
00:04:44 :Alors attendez, je vais grossir un petit peu, on va mettre 32, que tout le monde voit bien.Et je vais couper la cam. Top, ok, super. Donc je vais vous montrer, alors ça c'est
00:05:02 :un vieux truc. Donc je vais vous parler un petit peu déjà, je vais revenir sur la théorie,je vais vous montrer des trucs un petit peu plus abstraits et surtout au delà du ARGSet du Quarks, surtout le unpacking en fait. Donc c'est ce que d'ailleurs j'explique,
00:05:20 :si je reviens, ah merde je l'ai plus du coup, c'est sur l'autre écran. C'est ce que vousavez dans les, je crois, je vérifie que j'en parle, si ça veut bien charger. Sur les Glossaires,
00:05:35 :ils veulent pas charger, ARGS. Donc c'est en fait, ce qui est important c'est de, jecrois, je vérifie, l'opérateur splat, ouais alors je parle de l'opérateur splat, je penseque c'est peut-être plus dans les cours vidéo, je crois que j'en parle, désolé je regarde,qu'une convention, le double opérateur, ouais ok. Ok donc je, ok, je parle, donc dans les
00:06:08 :Glossaires j'en parle pas plus que ça, mais je crois que dans les vidéos j'en parle plus,donc vous pouvez faire une recherche sur ARGS et Quarks, il y a pas mal de vidéos qui parlentde tout ça, que ce soit à l'intérieur de projets ou directement sur les parties plus
00:06:22 :génériques. Donc en fait ce qu'il faut bien comprendre c'est que ARGS et Quarks c'est desnoms génériques, on peut mettre ce qu'on veut en fait, c'est quand même des conventionsqui sont largement suivies, mais je sais que ça arrive des fois, je réfléchis à desexemples, je sais que j'ai déjà vu d'autres choses qui sont utilisées, d'autres noms
00:06:43 :qui sont utilisés, je sais plus exactement pourquoi, mais il me semble qu'il y avaitdes bonnes raisons, mais en fait c'est des noms qui sont génériques. Donc ARGS en fait
00:06:51 :c'est le raccourci pour arguments, et Quarks c'est keyword arguments. Donc c'est le raccourciKW c'est keywords et ARGS arguments. Donc en fait la seule différence entre les deux
00:07:05 :c'est qu'il y en a qui sont des arguments non nommés, et il y en a qui sont des keywordarguments, donc keyword arguments c'est des arguments mots clés, des arguments nommés.
00:07:15 :Alors qu'est-ce qu'on entend par argument nommé et argument non nommé? Si je faisune fonction classique comme ça, A B, donc un argument nommé, quand on crée notre fonctionici, on crée des paramètres, alors ça vous m'avez peut-être déjà entendu le répéterpas mal dans les cours, la différence entre les paramètres et les arguments c'est des
00:07:43 :petites précisions, pas de syntaxe, le vocabulaire qu'on emploie, vous allez avoir des fois desgens qui vont pas utiliser les bons mots, qui vont parler d'arguments, de paramètresde façon interchangeable, c'est pas exactement la même chose, quand on définit ici deséléments à l'intérieur de la fonction on parle de paramètres, et quand on envoie
00:08:07 :des éléments on parle d'arguments, et du coup là j'ai deux paramètres, un paramètreA et un paramètre B, et quand je vais appeler ma fonction je vais envoyer des arguments.
00:08:17 :Donc si je fais comme ça, quand je fais 1 et 2, si vous avez vu les cours sur les fonctionsça doit pas être étranger à vous, j'envoie ces éléments et quand je ne les nomme pas,donc là c'est vraiment des arguments et non pas des keyword arguments, ils vont aller
00:08:31 :dans l'ordre dans lequel sont définis les paramètres ici, donc 1 va être assignéà A et 2 va être assigné à B. Donc le coup des arguments et des keyword arguments
00:08:53 :c'est vraiment quand on appelle la fonction, et faut bien comprendre que du coup quandon va avoir des args et des quarks c'est vraiment le truc le plus chiant à dire, donc quandon va avoir des args et des quarks comme ça, vous allez les définir comme ça ici dans
00:09:06 :votre fonction, et après justement ce qui va définir ce qui est récupéré par argset par quarks c'est ce que vous nommez et ce que vous ne nommez pas. Donc là, j'enlève
00:09:19 :ça pour l'instant, je reviens sur mes arguments non nommés, donc args et arguments nommés,si là maintenant je fais ça, A égale 1, B égale 2, les deux vont être nommés, doncça va être que des keyword arguments, et je peux mélanger les deux, donc on pourraitfaire comme ça, on pourrait dire 1 et après B égale 2, donc on peut avoir à la fois
00:09:40 :des args et des quarks, donc des arguments non nommés et des arguments nommés. Ce qu'ilfaut comprendre aussi c'est les opérateurs, donc l'opérateur splat qui est ce petit trucici, l'astérisque, on a que pilote qui nous embête, je vais le désactiver, donc çal'astérisque, on appelle ça l'opérateur splat, splat comme ça, c'est son petit nom
00:10:02 :en anglais, je crois d'ailleurs qu'en français aussi on dit opérateur splat, je crois qu'ona utilisé le même terme, donc voilà si vous entendez ce terme splat c'est cet opérateur,l'astérisque, et ça en fait ce qu'il faut comprendre c'est le concept d'unpacking,et l'unpacking c'est très pratique, là encore j'en parle dans certains cours, je
00:10:21 :sais plus exactement lesquels, mais c'est assez pratique, vous pouvez chercher dansla recherche du site, vous allez trouver si vous tapez unpacking, il y a pas mal de vidéosqui en parlent, donc en fait l'unpacking c'est que ça va vous permettre de déballer deséléments, on s'en sert dans pas mal de situations, on s'en sert quand on fait par exemple des
00:10:41 :assignations, quand on fait, alors si je me trompe pas, si je fais comme ça, égal etje mets tac, alors je fais un exemple de tête là, il est pas content, je sais qu'on peutl'utiliser quand on fait des assignations, je me souviens des erreurs, égal, 1, 2, 3,
00:11:10 :donc si je fais ça là vous allez voir on peut faire ça avec un tuple ou avec une liste,comme ça, là si je print A, B et C, on va le faire sur trois lignes séparées, etC, donc si je fais ça en fait on va assigner des opérateurs, si je run ça, on va bien
00:11:26 :voir 1, 2 et 3, donc le 1 va être assigné au A, le 2 au B et le 3 au C, et alors c'estpeut-être le dernier seulement qu'on peut le faire, non je sais plus, hum, j'ai un blanc,parce que je sais qu'on peut... J'ai un doute là, j'ai ce genre de truc que j'utilise jamais,
00:11:48 :mais je sais que c'est possible de l'utiliser, il me semblait en fait dans mes souvenirs,on pouvait faire un truc comme ça, genre 3, 4, 5, on pouvait faire un truc comme ça,et mettre par exemple une astérisque ici, mais oui c'est logique que ça marche pascomme ça, parce qu'il faut bien récupérer quelque part, donc effectivement ça serait
00:12:05 :logique qu'on fasse comme ça, mais je me souviens plus, je me souviens plus, parceque normalement l'idée c'est qu'on peut unpacker la première valeur dans le A, ladernière dans le C, et les 3 au milieu, ou 4, ou 5, ou 6, peu importe, on a une valeurdans la même région. J'ai réussi, le splat je l'ai mis avant le B. Avant le B, ok, comme
00:12:30 :ça, ah ouais, donc c'est ça, donc c'est exactement ce que je voulais vous montrer,merci Gab, donc vous voyez comme je vous dis c'est le genre de truc que j'utilise, çac'est le genre de truc, je pense pas que je le montre ou j'en parle vite fait, je crois
00:12:46 :peut-être à certains moments, mais je suis même pas sûr, parce que justement c'estle genre de truc, je veux pas trop vous embêter la tête avec ça, parce que personnellementen presque 10 ans de code, j'ai jamais eu besoin de faire des unpackings comme ça,je le montre dans un article, ok. Mais par contre ça peut être pratique dans d'autres
00:13:04 :situations, donc c'est juste pour vous dire, je vous montre ça parce qu'en fait c'està chaque fois le même principe, c'est ce principe d'unpacking, et c'est après cequ'on va utiliser dans les ARCs et les QUARX. Donc là en fait, dans quel cas de figure
00:13:18 :ça peut être intéressant, ça peut être intéressant, c'est toujours l'exemple queje reprends quand on fait par exemple des fonctions, c'est toujours l'exemple que jereprends parce que j'en faisais beaucoup quand j'étais en effet visuel avec des trucsRGB, on a souvent des fonctions comme ça, donc par exemple quand on va convertir une
00:13:37 :valeur RGB, donc rouge, vert et bleu en hexadécimal, on peut avoir une fonction RGB to X, et onva passer des éléments ici, et bon là pour l'instant je vais juste faire, on va faireun truc comme ça, on va faire R, je vais mettre à la suite, G et B. Donc on va faire
00:13:58 :ça, et donc là si je fais RGB to X, donc là je peux passer les valeurs les unes àla suite des autres, donc on va mettre 128, 0, 255 comme ça, et si je fais un print deça, c'est vraiment juste pour l'exemple, vous voyez on a mis les trois valeurs à la
00:14:13 :suite, le truc c'est que, là vous voyez, je les ai mises comme ça, imaginez qu'onait une variable RGB, et que ici j'ai ces trois valeurs, hop, comme ça, bah là c'estun peu chiant en fait, si je veux faire, si je veux donner ces trois valeurs à RGB,
00:14:30 :je vais faire RGB, 0, RGB, crochet 1, RGB, crochet 2, ok? Là je les envoie sans lesnommer, mais je pourrais mettre R égal, bien sûr, c'est pareil, G égal et B égal.
00:14:47 :Donc vous voyez, c'est possible, mais c'est assez long, là on a que trois valeurs, çava, imaginez qu'on en ait 4, 5, 6 ou une dizaine, c'est un peu embêtant de les envoyercomme ça. Donc ce qu'on peut faire à la place, c'est faire du unpacking, donc pour
00:15:01 :ça on va utiliser justement cet opérateur splat, et on va passer RGB comme ça. Et donclà si je lance le script, hop, vous voyez qu'on a bien le même résultat. Donc qu'est-ce
00:15:10 :qui se passe en fait ici, unpacking c'est en français on parle de déballage, doncil faut vraiment penser à, j'aime bien prendre l'exemple de la boîte, en fait vous avez,et c'est un peu ce qu'on a avec une liste, une liste ou un tuple comme ça, mais j'aimebien la liste parce que les crochets, visuellement on a cette idée un petit peu de la boîte.
00:15:27 :Donc on a nos trois valeurs comme ça ici, et en fait ce qu'on va faire, c'est que quandon fait du unpacking, donc quand on met l'astérisque dedans, c'est exactement en fait comme sion enlevait les crochets. Donc en fait ce que ça va faire c'est que ça va déballer
00:15:40 :les valeurs, ça va les unpacker, plutôt que d'être contenu dans un seul objet, dansune liste, elles vont se retrouver en dehors de cette liste. Donc c'est pour ça qu'ici
00:15:48 :en fait quand on fait astérisque RGB, ça marcherait pas si on envoyait comme ça, sion envoyait 128, 0, 255, vous êtes d'accord que ça marcherait pas, parce que qu'est-cequi va se passer ici, et il me le dit, il me le surligne si je fais voilà, incorrectcall, parce que là en fait il s'attend à avoir trois valeurs, et nous on lui envoie
00:16:05 :une seule valeur, donc on lui envoie un seul tuple qui contient les trois éléments.Exactement c'est ça, ça va être ça. Donc là en fait ce qu'on fait c'est qu'on enlève
00:16:12 :en fait, on déballe, donc on enlève ici les parenthèses, et les trois valeurs peuventêtre envoyées donc respectivement à RGB. Donc c'est un petit peu ce principe là après
00:16:22 :qu'on va retrouver quand on a les args et les quarks. Donc les args et les quarks enfait ça vous permet de récupérer n'importe quel type d'argument, qu'il soit non nomméou nommé. Donc je vais vous montrer un exemple très simple, ça peut être en fait l'intérêt,
00:16:38 :il y a plusieurs intérêts, un intérêt qu'on peut avoir c'est de récupérer un nombreindéfini d'arguments, parce que là vous voyez j'ai RGB, mais imaginez qu'en faitma fonction ce qu'elle fait, c'est par exemple, je crois que c'est un exercice que je vousai fait, si on veut refaire une fonction sum, bah là en fait la fonction sum ce qu'elle
00:16:58 :va faire, on va faire un total par exemple, ça c'est vraiment, je crois qu'il y a exactementcet exercice sur le site. Là le problème c'est que si je mets des valeurs spécifiques,
00:17:08 :on pourrait mettre A, B, C, D, E, F, un truc comme ça, ici on ferait le total du coup,donc on dirait total égal A plus B plus C plus D plus E plus F, et on pourrait justetransformer tout ça, et on pourrait mettre ici par exemple égal 0, égal 0, égal 0,
00:17:27 :voilà, donc ça c'est un code qu'un débutant pourrait faire, c'est vraiment très schématique,c'est pour vous donner un exemple, on pourrait dire voilà je vais ajouter 10 plus 15 plus3 plus 4, et si je fais un print de ça, je lance le script, j'ai bien 32, je peux rajouter
00:17:44 :une autre valeur, ça marche, je peux en rajouter encore une autre, et le problèmec'est que si j'en rajoute trop, à un moment, on se retrouve avec voilà, on s'attend àavoir jusqu'à 6 arguments positionnels, donc là vous voyez bien la différence entreje me rappelais plus comment il le disait, des arguments positionnels et keyword arguments,
00:18:01 :donc arguments nommés, donc là vous voyez on en a envoyé 8 et donc ça marche plus,il y en a 2 de trop. Donc c'est pas très pratique, vous comprenez, si j'ai un truc
00:18:09 :comme ça, là c'est un peu coulé dans le béton, je peux pas en mettre plus. Doncc'est là où on va avoir en fait ce args, donc là ce qui est important comme je vousdisais c'est pas tant le args, on pourrait mettre notre cher Patrick ici, ce qui est
00:18:21 :important en fait c'est l'astérisque ici. Et quelle est la différence entre la simpleastérisque et la double astérisque, c'est que la simple en fait ça va être donc lesarguments positionnels, donc qui ne sont pas nommés, et si on met une double astérisquelà ça va être les arguments nommés. Donc là vous voyez d'ailleurs, PyCharm nous
00:18:40 :le montre très bien, quand je mets une seule astérisque là vous voyez ça marche, iln'y a rien qui est surligné, et si j'en mets une deuxième là, vous voyez toutesces valeurs ici, j'ai un truc en surbrillance qui m'indique, si je montre l'aide ici,il me dit remove argument ou alors il faut, non je sais pas, il me propose de changer
00:18:58 :la signature, mais donc là en fait vous voyez il faut que je spécifie, il faut que je lisepar exemple a égale 10, et là je peux mettre n'importe quoi, je peux dire test égale15, là on est plus contraint justement par ce qu'on avait avant, donc c'était a, b,
00:19:11 :c, d, e, f, etc, là je peux envoyer vraiment tout ce que je veux. Donc là vous voyez çac'est vraiment quand je mets les deux astérisques, on est avec les keyword arguments. Si j'en
00:19:20 :mets qu'une, là c'est bon. Et qu'est-ce qu'on a de l'autre côté, si j'affichePatrick tout simplement, je lance ça, et bien en fait on retrouve un tuple. Donc ce
00:19:29 :qui se passe c'est que ça c'est exactement comme quand on met quelque chose ici, c'estquelque chose qu'on va pouvoir, une variable qu'on va pouvoir, un nom en fait qu'onva pouvoir réutiliser dans la fonction, et ici qu'est-ce que ça va récupérer,et bien ça va récupérer un tuple avec toutes les valeurs ici. Donc là c'est pratique parce
00:19:46 :que je peux du coup par exemple afficher la première, là on récupère le 10, je peuxafficher la dernière, là comme je vous dis on peut en mettre autant qu'on veut. Je
00:19:53 :peux mettre d'autres valeurs ici, et je les affiche, et à chaque fois j'ai bien la dernièrevaleur, le 20, le 30, etc. Et donc là on pourrait faire effectivement, on pourrait
00:20:03 :faire total égal à 0, et pour i in Patrick, on ferait, et là on pourrait faire voilàtotal plus égal i, et on retourne le total. Et je crois que c'est la solution de ce que
00:20:16 :je vous montre dans l'exercice pour recréer la fonction sum. Donc si je lance ça, ona bien la sum de tout ça, si j'enlève ou que je rajoute, ça va fonctionner de lamême façon, voilà 108, je peux rajouter 500, on va avoir 608, etc. Ok, donc vous voyez
00:20:30 :là en fait ce qu'on a c'est tout simplement un tuple, et donc le tuple on peut bouclerdessus pour récupérer toutes les valeurs, les ajouter à une variable totale, et retournerle total. Et si je mets deux astérisques ici, là comme je vous dis ça ne fonctionne
00:20:44 :plus, et là ça va falloir nommer les arguments, et donc là ça ne fonctionnera plus de lamême façon, ça pourrait être utile par exemple, je vais vous montrer des exemplesaprès, en dehors de la théorie, parce que pour l'instant vous vous dites peut-êtrequ'à part recréer la fonction sum ça ne sert pas à grand chose, mais là voilà, je
00:21:00 :pourrais dire par exemple, on va remettre les quarks, mais comme je vous dis là encoreon pourrait mettre patrick, je vais remettre quand même les quarks pour rester avec lesconventions. Donc là c'est pratique parce que je peux dire par exemple, save="true",
00:21:13 :et là je fais un print de quarks, et là ce qu'on va avoir c'est un dictionnaire cettefois. Donc on va avoir un dictionnaire avec en clé le nom de l'argument et en valeur
00:21:22 :sa valeur. Donc ça c'est pratique pour plein de choses, je vais vous montrer des exemples,et on peut avoir les deux aussi, c'est ça qui est important et qu'on retrouve souvent,c'est qu'on a à la fois les args et les quarks, donc là je pourrais faire un printargs, je vais enlever ça, et là on pourrait dire on envoie déjà 5 et 10 et on fait un
00:21:41 :save. Et donc là on aura bien dans un tuple le 5 et le 10 et dans un dictionnaire lesarguments nommés. Et dès que je mets quelque chose, si je mets b ici, le b va se retrouver
00:21:51 :dans les quarks et le 5 il sera dans les args. Ok? ça va jusque là? je suis allé unpetit peu vite, n'hésitez pas si vous avez des questions. Jusque là ça va? ok. Donc
00:22:10 :maintenant à quoi ça peut servir? Donc déjà pour vous quand vous faites une fonction,alors ça peut, il peut y avoir en fait, c'est plus souvent en fait, on va s'en servir plussouvent quand on fait de l'orienté objet et quand on va avoir de la surcharge, doncquand on va en fait faire une, par exemple je vais vous montrer un exemple, je vais vous
00:22:33 :en montrer un dans Django après, imaginez qu'on ait une classe ici objet, et que justementdans cette fonction on ait un save, et c'est ce qu'on va voir dans Django, et qu'aprèsvous faites votre propre classe, on va dire super objet, bah là vous pouvez créer votrepropre classe save, qui va du coup être, soit qui va complètement écraser celle que
00:22:56 :vous avez ici, soit qui va justement la surcharger, c'est à dire qu'avec super on va appelerla méthode du parent, alors là je les ai pas mis en, faut que je les mette en héritage,donc là vous voyez en fait avec super, donc là je vais un petit peu plus loin, ceux
00:23:11 :qui n'ont pas fait de l'orienté objet ça va peut-être commencer un petit peu à vousperdre, je vous laisserai regarder un peu plus lentement en rediffusant, je vais essayerde ralentir un petit peu le rythme là, et d'expliquer principalement. Donc là en fait
00:23:24 :le super nous permet d'appeler la fonction save de la classe dont on hérite, donc làon va déjà appeler ça, on va déjà appeler le save du super, le super c'est quoi? C'est
00:23:33 :l'objet, donc en fait on va appeler cette fonction ici, et après on pourrait faired'autres choses en plus, donc là je vais faire on save le super objet, ok? Et là
00:23:42 :je vais faire on save l'objet. Je fais ça, je vais créer donc une instance, on va faireun super, super objet égal super objet, et si je fais super objet point save, je lance,hop, donc là vous voyez on save l'objet et on save le super objet, parce que j'ai
00:24:05 :le super, donc là qu'est-ce qu'il se passe? On appelle déjà le save de la classedont on hérite, donc on print, on save l'objet, et ensuite on fait le print, on save le superobjet. Et l'ordre a une importance, parce que si je mets le super avec, et ça notamment
00:24:19 :j'en parle parce que dans Django c'est important, parfois en fait quand on va surcharger laméthode save, on va vouloir que Django fasse justement ce qu'il fait de son côté, parceque si on fait pas le super en fait le problème c'est qu'on va complètement supprimer ceque Django pourrait faire, parce que Django quand on save, quand on sauve un modèle,
00:24:40 :lui il va sauver le modèle dans la base de données, il va faire plein d'opérationsdont on a pas besoin de connaître l'existence, en fait on s'en fout, on veut juste qu'ilfasse ce qu'il fait quand on save un modèle dans la base de données. Le truc c'est que
00:24:52 :nous après, c'est ce que je montre par exemple, l'exemple le plus flagrant, enfin celuique je montre le plus souvent, c'est pour rajouter un slug, donc pour automatiquementquand on save un modèle, modifier un champ, l'ordre a une importance et le super aussi,parce que si vous mettez pas le super vous allez juste faire votre opération, par exemple
00:25:07 :modifier un champ pour rajouter un nom ou modifier une valeur etc, là convertir dansune autre devise par exemple pour un city commerce, je dis ça parce que Gabriel estdans le city commerce donc ça peut te donner des exemples, mais le problème c'est quesi on fait pas le super, en fait on va juste faire la modification du champ par exemple
00:25:26 :de notre côté et on va pas faire tout ce que Django fait de son côté pour sauverl'élément en base de données. Et l'ordre a une importance parce que par exemple si
00:25:34 :on fait des éléments ici, dans le save par exemple avec Django, quand on fait des chosesici dans le Django, le modèle est pas encore sauvé, parce que justement on bypass un peu,on vient surcharger cette méthode save, donc ça veut dire que là on va faire des éléments
00:25:51 :au moment de sauvegarder, mais en fait la sauvegarde dans la base de données elle vase faire uniquement ici. Donc ça veut dire, ça c'est une erreur que je vois très souvent,
00:26:00 :quand on sauve un objet la première fois dans la base de données, bah du coup à cetendroit là ici, si on a pas fait le super avant, il est pas sauvegardé, donc là vouspourriez faire par exemple print self, donc qui est l'objet en base de données, et si
00:26:13 :vous voulez afficher la clé primaire ou afficher un champ, il va vous dire bah l'objet n'existepas, et c'est normal parce qu'il a pas encore été sauvegardé. Donc dans ce cas là l'ordre
00:26:21 :a une importance, il faut déjà que vous mettiez le super.save pour que Django puissesauvegarder l'objet en base de données, et après vous pouvez par exemple le modifier.
00:26:30 :Donc il y a des cas de figure comme ça dans lesquels l'ordre va avoir une importancesi l'objet n'existe pas. S'il existe déjà, vous pouvez déjà le modifier et après faire
00:26:40 :le save, mais voilà. Des fois en fait on fait les choses sans trop se poser la questionet dans un cas de figure ça marche, et après dans un autre cas de figure ça marche pason comprend pas pourquoi. Donc voilà, l'ordre a une importance dans ce cas-ci, et le super
00:26:53 :ne va pas arrêter, la fonction s'associe, une erreur que je vois souvent c'est que lesgens en fait ils se disent je vais mettre le super à la toute fin parce qu'ils pensentque c'est comme si on faisait un return en fait. Alors que pas du tout. Le super même
00:27:03 :si vous avez un return, de toute façon même si on en met pas il y a un return à la finde chaque fonction, même si vous vous ne le mettez pas directement, c'est comme si onretournait none ici à la fin. Mais voilà, si vous avez un return ici qui soit visible
00:27:18 :ou pas, le return il est uniquement dans cette fonction ici. Donc c'est-à-dire que quandvous faites super.save, oui cette fonction elle va s'exécuter et il va y avoir un return,
00:27:27 :mais ça va pas arrêter cette fonction ici. Donc vous pouvez très bien le mettre au débutet avoir des éléments qui se déroulent après, ça va pas arrêter. Donc tout ça
00:27:35 :va être exécuté. Je le dis parce que j'ai déjà vu l'erreur quelques fois. Je croisqu'il y avait quelqu'un qui parlait dans le chat. Alors, Kev comme c'est un def, désolé
00:27:47 :j'ai pas, c'était avec l'ancien exemple, on peut l'utiliser avec direct. Oui du coupune fonction, je pense que tu parlais des quarks etc. Effectivement quand tu as un quark
00:27:58 :tu peux donner ce que tu veux en fait. Et c'est là que ça va devenir intéressanten fait, c'est qu'on va pouvoir, je vais vous montrer en fait un exemple avec SendinBlueque justement je suis en train de faire, c'est exactement ce sur quoi je travaillais justementen début de semaine pour les notifications. Vous allez voir que ça peut être très important
00:28:15 :quand justement des fois on a des paramètres qui peuvent varier. Et vous allez voir dansquel cas de figure, ça c'est vraiment le genre de choses, il faut voir les cas de figureparce que tant qu'on n'est pas confronté à ça, on comprend pas trop. Donc je pense
00:28:26 :qu'avec ce cas précis vous allez comprendre tout l'intérêt des quarks. Donc désoléj'explique beaucoup de choses mais c'est beaucoup de trucs qui ont leur importanceaussi. Donc pourquoi l'héritage, pourquoi je parle de tout ça dans les classes etc.
00:28:39 :Et bien ça a son importance parce que, je reviens dans un exemple de Django parce qu'onle voit souvent, quand vous faites un save vous allez passer des informations éventuellement,alors je sais jamais lesquelles, je sais plus si c'est commit, je vais aller voir vitefait la documentation Django save pour vous donner un vrai exemple. Parce que quand on
00:29:08 :utilise la méthode save en fait, je réfléchis, moi c'était des exemples plus spécifiques.Alors, mon internet est super lent. Ça va vous de votre côté là? Ça lag pas trop? J'ai
00:29:27 :mon navigateur je crois qui est bien bugué, je sais pas, tout bon? Ok. Bon il veut pas,ok. Je sais pas ce qu'il a, on va ouvrir Brave, j'aurais dû redémarrer mon ordi avant,
00:29:44 :ça fait un petit moment qu'il tourne. Donc Django save. Donc en fait la méthode save,je regarde parce que justement j'utilise rarement. Save method, ok. Donc voilà, je vous le mets
00:30:02 :sur l'écran ici pour vous montrer. Donc quand on save un modèle, quand on sauve un modèle,hop. Donc quand on sauve un modèle vous voyez ici vous avez pas mal de choses que vous pouvez
00:30:13 :passer, force insert, force update, using, update fields, donc je sais pas, est-ce qu'ily a des exemples ici? Non, ok. Update fields. Ok, voilà, je sais pas trop à quoi ils servent
00:30:27 :tous ces trucs là, je les ai rarement utilisés mais vous voyez qu'on peut passer des chosesà cette méthode. Donc pourquoi c'est important? Parce que imaginez, donc là je vais faire
00:30:37 :un exemple un peu plus Django-like du coup, donc on va l'appeler base model, et hop,et ici je vais l'appeler blog post. Voilà, on va reprendre le super exemple de blog.
00:30:51 :Donc là Django va dire par exemple on sauvegarde l'objet dans la base de données, et là justementvous allez avoir en fait une signature, c'est-à-dire que ça c'est la méthode save de base, donccelle qui est définie par Django, par les gens qui ont développé Django, ils ont fait
00:31:09 :une méthode save, ils se sont dit, donc on va en prendre juste un par exemple forceinsert, donc on va dire force insert ici, et là true par défaut, et on va dire doncif force insert, on va sauvegarder l'objet dans la base de données, et on va dire else,
00:31:28 :je sais pas, on va faire une vérification, on vérifie que l'objet peut être gardé,et si c'est le cas, on va dire if, je vais essayer de faire un truc quand même pas tropdégueulasse, vérification égale true, et on va dire, je vais rester sur l'abstrait,désolé. Donc voilà, imaginez qu'on ait un if ici, on vérifie que l'objet peut être
00:31:54 :sauvegardé, et s'il peut être sauvegardé, on sauvegarde l'objet dans la base de données.Donc si on fait un force insert, en gros on dit on s'en fout, on vérifie même pas siça peut être sauvegardé, on le sauvegarde même si ça crée une erreur ou quoi quece soit, et sinon si on a pas le force insert, on fait une vérification avant pour s'assurer
00:32:11 :que l'objet peut bien être sauvegardé en base de données, et ensuite on le sauvegarde.Donc voilà, on a un paramètre ici, et nous ce qu'on va vouloir faire ici, quand on sauvenotre article de blog, donc là je vais faire un article, et là je veux sauvegarder monarticle. Et nous ce qu'on veut faire c'est que, après la sauvegarde, on va envoyer une
00:32:32 :notification, donc là imaginez on est un notify, là on dit send mail, et là commeje disais, ça va faire le pont avec le petit truc send in blue qui va me permettre demontrer les args dans un cas très spécifique. Donc send mail, voilà, bon là je vais avoir
00:32:53 :des erreurs, je vais le mettre comme ça, imaginez, je fais un test, donc là send mail,voilà on envoie un mail, un article a été publié. Ok, on va faire un print, on va
00:33:07 :rester sur les prints comme ça je le connais, ok. Donc nous voilà ce qu'on veut faire,c'est que, ok je vais m'arrêter un petit peu parce que j'écris beaucoup de trucs,donc on a notre blog post qui hérite de base model, base model donc c'est les gens quiont fait Django, ils ont défini base model, ils se sont dit voilà, on va faire une méthode
00:33:24 :save qui permet de sauvegarder les éléments dans la base de données, on a une méthodeforce insert qui nous permet de forcer la sauvegarde si jamais c'est atrue, donc c'estle comportement par défaut, et nous on fait donc un blog post, donc un article de blog,et ce qu'on veut c'est que quand on sauvegarde l'article, on veut indiquer aux gens que
00:33:45 :l'article a été publié. Donc ce qu'on va faire, c'est qu'on va surcharger save,donc c'est à dire qu'on veut que Django fasse toute sa logique pour sauvegarder l'élémentdans la base de données, mais on veut rajouter des éléments. Donc comme je vous dis, si
00:34:00 :on ne met pas le super ici, si on ne met rien et qu'on fait juste if, par exemple, if published,voilà, if published, on va dire notify. Donc si on fait juste ça, le problème c'est
00:34:15 :que, on va enlever ça, on va rester simple, donc voilà, on dit juste que quand on veutsauvegarder, on va notify. Donc le problème de ça, c'est que là on ne va pas sauvegarder
00:34:24 :l'élément, on va juste faire un notify. Donc ce qu'on va faire, c'est déjà appelerla méthode save de notre classe parente, et après on va faire un notify. Ok? Comme
00:34:36 :ça on s'assure qu'on fait le comportement par défaut, et ensuite on avertit les gens.Et là vous voyez, encore une fois, PyCharm qui me suggère qu'il y a un petit problèmeici. Vous voyez que le problème ici, c'est que le force insert, je ne l'ai pas mis ici.
00:34:50 :Donc imaginez que finalement, ici, on souhaite pouvoir avoir accès à cet attribut ici.Ben là on ne peut pas, parce qu'on a modifié ce save, mais on n'a pas repris en fait cette... Merde, j'ai plus le mot, pas la définition de la fonction, mais la construction, enfin
00:35:11 :il y a un mot qu'on utilise pour parler, la signature de la fonction. Donc là en faitvous voyez, il y a une différence entre les deux. Il y en a un qui a le self, le fameux
00:35:22 :self de l'orient objet, je ne reviens pas là dessus, s'il y en a pour qui c'est flou,il faudra regarder les parties sur l'orient objet, pour l'instant oubliez-le si vous nesavez pas ce que c'est. Mais voilà, là d'un côté on a un paramètre ici, force insert,
00:35:35 :et là on ne l'a pas. Donc on a une différence entre les deux, et le problème c'est quesi on souhaite changer, si on souhaite par exemple dire ici, bon s'il y a un problème,je ne préfère pas que tu publies, enfin que tu sauvegardes l'article, ben là on pourrait
00:35:47 :dire force insert égal false, mais là vous voyez ça ne marche pas. Parce que nous qu'est-cequ'on va appeler? On va appeler la méthode save de notre article ici, et là on ne peut
00:35:54 :pas l'envoyer. Donc si je lance ça, là je vais avoir une erreur. Ok, save got an expectedkeyword argument force insert. Donc ce qu'on peut faire, c'est tout simplement ici, refaire
00:36:03 :cette signature. Donc on va dire force insert égal à true, et ici on va passer forceinsert égal false insert. Et là ça marche. Du coup on recrée exactement la même fonction
00:36:16 :avec la même signature, et on passe les choses en bout de ligne. On dit que force insertégal à true, et quand on appelle le save de super, on passe à force insert, donc àce force insert ici, la valeur qu'on a définie ici. Donc là du coup je peux le dire false,
00:36:33 :je vais appeler save. Je vais faire un debug, ça va être plus clair. Donc là on appellele force insert, alors il ne va pas, ah oui non il faut que je le mette dans, je l'aimis sur la signature. Donc hop, on arrive ici, donc là le force insert nous on l'a défini
00:36:50 :à false, donc vous voyez ici force insert qui est à false. On va appeler donc super.save,on va passer le false ici à force insert, donc là je vais rentrer dans le save. Ici
00:37:02 :force insert il est à false, donc ça veut dire qu'on ne va pas forcer le insert. Doncje continue, donc on passe dans le else, on vérifie que l'objet peut être sauvegardé,on sauvegarde l'objet dans la base de données, et ensuite on revient ici, on fait le notify,et donc là dans le notify on fait juste un print, et voilà. Après c'est fini. Donc
00:37:23 :on vérifie que l'objet peut être sauvegardé, puisqu'on a mis force insert false, on sauvegardel'objet et on notify. Un article a été publié. Donc là vous vous demandez peut-être pourquoi
00:37:33 :nous on voulait parler des args et des quarks, pourquoi ils nous parlent de tout ça? Bahtout simplement parce que là vous voyez j'ai remis un paramètre, donc là il n'y en a qu'un,mais si vous vous souvenez bien quand je suis allé voir ici, il n'y en a pas qu'un, il
00:37:46 :y a force insert qui est égal à false, il y a force update, il y a using, et il y aforce update fields. Et c'est possible, je ne sais pas s'il y a d'autres méthodes ici,
00:37:55 :bon là il y en a deux, enfin voilà, bon là il n'y en a pas énormément, mais c'est possibledans des méthodes des fois d'avoir 10 ou 15 paramètres comme ça. Donc vous serez d'accord
00:38:04 :que c'est un petit peu embêtant si à chaque fois qu'on fait une surcharge, là la surcharged'ailleurs vous voyez elle est indiquée dans PyCharm, on peut aller cliquer ici pour voirqu'est-ce qu'on surcharge. Donc vous êtes d'accord que c'est un peu chiant si en fait
00:38:15 :à chaque fois on doit recréer la signature de la fonction d'origine, ça veut dire quedéjà il faut qu'on aille voir, donc ça veut dire ok je vais aller voir dans le trucd'origine, il a force insert, ok donc il faut que je mette force insert, que je le remette,
00:38:27 :que je mette le using, que je mette machin etc. Donc ce serait vraiment assez pénible.Et surtout pour des trucs qui, comme je vous le dis, finalement si ça se trouve en fait,enfin, ça c'est des trucs que je n'utilise jamais, donc moi je veux juste les mettreau cas où parce que voilà, je veux que si jamais à un moment j'ai besoin de les utiliser
00:38:42 :ce soit possible, mais je n'ai pas envie à chaque fois d'aller regarder. Donc c'estlà qu'on peut mettre les args et les quarks. Donc on met les deux généralement, parce
00:38:51 :que des fois il peut y avoir des arguments non nommés ou des arguments nommés, doncpositionnels ou nommés. Donc on met les deux comme ça on est sûr de tout passer, et on
00:39:00 :fait la même chose ici, c'est à dire qu'on va passer les args et les quarks, et c'estlà où on se retrouve avec cette fameuse notation où ici on récupère les args etles quarks et on les renvoie ici. Donc là qu'est-ce qu'on s'assure en fait? On s'assure
00:39:12 :que peu importe ce qui est défini ici, là il pourrait y avoir dix mille autres trucs,on pourrait avoir un autre chose, je sais pas, on pourrait avoir plein de trucs iciqui sont passés. On va remettre le update égale à false, le using égale à false,
00:39:27 :des trucs comme ça, voilà. Donc là on peut avoir plein de choses ici, et bien je n'aipas besoin de savoir, je mets juste args et quarks, et là si quelqu'un il veut envoyerle update, et bien il peut, il va envoyer le update, il va dire update égale à true,
00:39:39 :et là vous voyez il n'y a pas d'erreur, parce que l'update ici va être récupérépar les quarks, et on va l'envoyer à notre super.c. Alors un truc qu'il faut bien noter
00:39:48 :aussi c'est de ne pas oublier de remettre l'astérisque ici, parce que si vous la mettezpas, là qu'est-ce que vous faites? En fait vous envoyez le tuple au complet et le dictionnaire
00:39:56 :au complet. Donc là qu'est-ce qu'il faut faire en fait? On revient à la même choseque tout à l'heure, c'est que quand on faisait le rgb, c'est que si j'envoie, donc si j'aimon fou comme ça, rgb, je le refais, hop, donc si j'envoie ma valeur, ici on a rgb
00:40:20 :égal à tuple 128, 255, 128, donc si j'envoie le rgb d'un coup comme ça, voilà, là c'estce qu'on aurait si on mettait pas l'astérisque. Et là le problème c'est que du coup on va
00:40:34 :envoyer tout le tuple ici à la première valeur et le g et le b vont rien recevoir.Nous ce qu'on veut c'est envoyer celle-là au r, celle-là au g, celle-là au b. Et ce
00:40:43 :serait pareil du coup si on avait un dictionnaire ici, si on mettait r à 128, g à 255, etc.Je pense que vous avez compris l'idée, et b à, voilà. Donc si on fait ça, là c'est
00:41:00 :pareil en fait, là il faut que je ne paque le dictionnaire, donc avec les deux astérisques,pour dire ok tu vas donner, plutôt que de passer rgb en fait, et si je fais un print,comme ça on va faire un print, on va lancer, invalid argument, alors qu'est-ce que j'ai
00:41:18 :fait, rgb, r, gb, ouais, ah oui non j'ai fait print, désolé, c'est fou, je me disaisok, je ne comprenais pas ce qui se passait. Donc là vous voyez on a bien le 128, 255
00:41:42 :exemple ici, on aura une erreur, un expected keyword arguments a. Donc c'est pour çaque c'est bien important de mettre les astérisques, parce que si vous ne mettez pas les astérisques,que ce soit la simple ou la double, donc l'opérateur splat, là vous allez envoyer en fait toutle dictionnaire, vous allez envoyer ce dictionnaire rgb, c'est à dire que le r, c'est un peu
00:42:03 :comme si on faisait comme ça, le r va être égal à tout le dictionnaire. Donc trèsimportant autant ici de mettre les astérisques pour dire bon bah là dans cette variable ici,là encore on pourrait l'appeler autrement, on pourrait le mettre, ah merde, j'ai faitun ctrl h, ici là on pourrait mettre test, il n'y a pas de soucis, c'est vraiment l'astérisque
00:42:25 :qui est importante. Donc voilà, c'est juste pour dire ici on va récupérer tous lesarguments positionnels et ici on va récupérer tous les arguments nommés et on va les renvoyerà save. Ok? Ça va pour ça? Tout bon jusque là? Donc ça c'est l'exemple qu'on voit
00:42:44 :le plus couramment, c'est voilà, vous avez le args et le quarks qui sont récupérésdans cette fonction et ensuite on les renvoie quand on fait un super, c'est un truc trèsclassique et c'est pour ça que je vous ai montré tout le truc de l'orienté objetparce que c'est 99% du temps dans ces 4 figures là qu'on le fait, c'est pour, voilà, parce
00:43:00 :qu'on va surcharger une fonction, donc on veut pouvoir récupérer tous les paramètrespossibles qu'on va envoyer et ensuite les passer le long de la chaîne si vous voulez,sans avoir besoin à chaque fois d'aller regarder la signature de la fonction d'originepour ne pas avoir à tout réécrire à la main. Ok? Maintenant je reviens sur le truc
00:43:23 :que je vous disais avec SendinBlue, donc dans SendinBlue en fait par exemple quand j'envoiedes mails, je peux faire des templates et ces templates je peux mettre des variablesdedans et le truc c'est que les templates ils vont avoir différentes variables, doncpar exemple quand j'ai un mail qui est envoyé quand il y a quelqu'un qui répond, je vais
00:43:45 :avoir le user et from user, donc user c'est la personne qui a posé la question et fromuser c'est la personne qui a répondu. Et donc dans mon mail je vais avoir un truc comme
00:43:58 :ça, params.user, donc ça c'est dans SendinBlue en fait, ils vous permettent de récupérerdes paramètres qui sont envoyés, quand vous faites request.post vous allez lui dire voilà
00:44:08 :envoie à l'API send, voilà, de SendinBlue et dans les datas tu vas lui donner des élémentstrès schématiques mais ça ressemble quand même un petit peu à ça, et là on va luidonner par exemple user égal gab et from user égal, voilà. Donc on peut faire ça
00:44:33 :comme ça et là le truc c'est que du coup ces datas vont être différentes, ça va êtrepar exemple template nouvelle réponse mentora, mais je pourrais avoir un template nouvel articlede blog, et là ce serait par exemple params.description, ici ce serait params.title par exemple, ok.
00:45:00 :Donc là je vais avoir des choses différentes dans l'email, et le truc c'est que moi j'aifait du coup, pour pas avoir à chaque fois à mettre request post, l'URL de l'API avecplein de trucs comme ça, c'est assez pénible à retenir tout ça, donc je me suis fait
00:45:13 :une fonction sendMail où je vais lui dire le template à utiliser, donc par exemplec'est un numéro, donc là on va dire int, et ensuite justement je vais vouloir passerdifférents datas, sauf que les datas ça va être différent à chaque fois, et peut-êtrequ'après je vais créer dans le futur d'autres templates qui auront d'autres paramètres,
00:45:32 :donc là j'ai pas envie ici de prendre tous les cas de figure et de dire donc on va mettreuser, from user, donc ça c'est pour le template de question de mentora, pour les articlesde blog on va avoir une description et un titre, pour un autre type de notification
00:45:46 :on va avoir d'autres choses, donc là ça voudrait dire qu'il faudrait que je mettedans les paramètres de la fonction tous les cas de figure, et donc on aurait une fonctiongénérique sendMail qui servirait à tous les types de notifications, mais des foisen fait quand c'est une notification de mentora j'utiliserai que ces deux paramètres, quand
00:46:00 :c'est un nouvel article de blog j'utiliserai juste cela, donc c'est pas très pratique.Un truc qu'on pourrait faire à la limite c'est faire des sous-fonctions, donc faireune fonction ici sendMailBlog etc pour décomposer les choses et avoir juste certains paramètresselon les types de notifications, mais moi je préfère avoir un truc générique ici,
00:46:24 :et donc ce que je vais faire ici c'est juste dire dis-moi le template et ensuite tu prendsles quarks. Donc là l'intérêt c'est que du coup je peux dire, hop je vais mettre ça
00:46:36 :ici, et donc là c'est beaucoup plus versatile parce que du coup je peux faire sendMail,je vais lui dire le template donc ça ça bouge pas, par exemple ici on va dire nouvel articlede blog publié, donc nouvel article de blog sur le template 120, sauf que ici, ben voilà,
00:46:56 :là je vais dire description égale, je sais pas, petit projet Django, et titre, hop,titre title, on va mettre ouais, Django, voilà. Donc on fait un truc comme ça, donc là vous
00:47:13 :voyez que du coup, alors là après il va falloir adapter cette fonction, mais là,donc voilà, je vais juste créer les fonctions, donc nouvel article de blog et nouvelle réponse.
00:47:23 :Du coup je peux mettre autre chose, je vais mettre from user, je vais mettre gab et hop,user égale, ok? Et du coup, ben ici je peux récupérer dans quarks, et ce que je vais
00:47:36 :faire ici, plutôt que de passer le dictionnaire, ben on va passer tout simplement, et alorslà justement, je vais pas passer, je vais pas mettre les astérisques, là je vais passervraiment juste le quarks, ok? Donc là encore, très important de comprendre vraiment ce
00:47:48 :qu'on fait, est-ce qu'on veut déballer, unpacker le dictionnaire comme on l'avaitfait dans cette fonction ici, pour passer les éléments comme ça, là on a besoindes astérisques, parce qu'on comprend bien qu'on veut pas passer le dictionnaire directement,mais on veut passer les clés et les valeurs comme des arguments positionnels, des arguments
00:48:07 :nommés, pardon, keyword arguments, quarks, et là par contre ce qu'on veut c'est pas,on veut pas envoyer from user égal gab, on veut pas envoyer ça, on veut vraiment envoyerle dictionnaire ici. Donc là on met pas les astérisques ici devant, on met juste le dictionnaire
00:48:25 :direct. Et donc là ce qui est intéressant c'est que voilà, les deux fonctions vontmarcher, dans le cas du nouvel article de blog, hop là on va dire par exemple un autre,hop, 119, donc voilà, dans le cas de l'article de blog, j'ai juste à dire, ben le template
00:48:40 :c'est 121, après on envoie tout ce qu'on veut dans les paramètres du request, et pourla nouvelle réponse, voilà, on fait 119, on met un autre template et on met d'autresvaleurs. Ok? Donc là vous voyez c'est vraiment, ça permet d'avoir quelque chose qui est ultra
00:48:57 :versatile, qui va vous permettre d'avoir des signatures différentes qui vont dépendre,vous pouvez aussi justement, après vu que ça c'est un dictionnaire, un truc qu'on voitaussi très souvent, je réfléchis, je sais que je l'ai beaucoup fait, qu'est-ce qu'onavait? Ouais après c'est ça en fait, c'est que des fois vous allez avoir des, vous pouvez
00:49:17 :avoir des cas de figure, où justement vous allez avoir, nous on avait des trucs, alorsattendez je réfléchis pour vous donner un exemple précis, on avait des fonctions enfait qui avaient des, justement un peu des comportements similaires, j'arrive plus àme rappeler pourquoi on avait fait ça, mais en gros on avait des fonctions wrapper, donc
00:49:47 :qui allaient un peu comme des décorateurs, qui quand en fait, je crois que c'est quandon devait, on avait fait une nouvelle version du pipeline, on devait garder une ancienneversion qui continuait à fonctionner, et donc en fait à chaque fois, on avait fait unefonction wrapper comme ça, et dans les quarks on regardait par exemple si on avait un v1,
00:50:10 :et ben là on envoyait la fonction, voilà on avait un truc comme ça par exemple, làon envoyait fou v1 par exemple, et si on avait v2 on envoyait fou v2, et donc en fait cequ'on peut faire ici c'est que le quark, vu que c'est un dictionnaire, on peut vérifier,
00:50:27 :on peut dire est-ce que tu m'as envoyé quelque chose, et donc là on pourrait dire ici v1égal to, et là comme ça on aurait le send mail v1, sinon voilà on envoie et on retourne,voilà c'est très schématique mais c'était un truc comme ça que je me rappelle qu'on
00:50:48 :avait fait, on voulait juste modifier une fonction, pouvoir passer d'un pipeline àl'autre, et du coup ce qu'on avait fait c'est qu'on avait une fonction wrapper quiétait utilisée en décorateur, donc après sur toutes nos fonctions on mettait un wrappercomme ça, et du coup on passait en argument v1, c'est très schématique, c'était plus
00:51:10 :compliqué que ça, il y avait des raisons pour lesquelles on avait fait ça, parce quenormalement avec juste un décorateur on pourrait s'en sortir, sans forcément avoir besoinde ça, mais voilà, c'était juste pour dire que le Quarkz on peut l'utiliser aussicomme ça pour vérifier en fait ce qu'il y a à envoyer et faire des choses différentes.
00:51:27 :On pourrait même sans aller dans un truc ultra complexe comme ça, juste dire voilàsi vous avez par exemple un title quelque part, c'est un type de notification où ona un titre, donc ça veut dire qu'il faut faire quelque chose, et c'est tout. C'est
00:51:39 :juste un dictionnaire donc vous pouvez faire ce que vous voulez avec. Je vois une question,je m'en fous c'est FooBar, c'est les trucs, je ne suis plus sûr qu'elle est la, pourquoi,j'ai déjà lu là dessus, FooBarBase, où est-ce que ça vient, je ne sais plus. Ah
00:52:14 :oui, ah oui oui. Mais il y a un autre truc aussi, c'est souvent des trucs militaires,je ne sais plus, il y a le bug, le fameux bug, pour ceux qui connaissent l'histoire,c'est véritablement l'insecte qui a fait planter le truc, mais oui FooBar, FuckedUp Beyond All Recognition, mais c'est des termes assez classiques qui sont utilisés
00:52:38 :quand tu veux faire des fonctions de test, c'est un peu le Patrick, si tu veux, monPatrick, moi j'utilise Patrick, dans le monde du dev en général ils n'utilisent pas Patrick,ils utilisent FooBar. Donc il y a FooBar, avec Python tu as beaucoup de Eggs, Spam,
00:52:54 :et je ne sais plus quoi, Python, parce que ça vient des, voilà, Spam, Eggs and Ham,Placeholder Variables, ça a à voir avec les Monty Python je crois, mais je ne sais pluspourquoi. Donc voilà, c'est juste des trucs qui sont utilisés régulièrement. C'est d'ailleurs,
00:53:13 :c'est pas un truc que je conseille de mettre dans ton code, c'est vraiment juste quandtu fais des exemples comme ça, de façon éducative, parce que comme on dit souvent,nommer les choses c'est le truc le plus chiant du monde, donc je pense que les profs qui répètentles cours régulièrement, ils en ont eu marre justement de chercher des noms et tout à
00:53:34 :chaque fois. C'est comme moi, c'est ça le Patrick, c'est qu'à chaque fois j'étais là,genre bon on a une personne, on va prendre, et à chaque fois vous devez penser à unprénom, donc à un moment je me suis dit, ok ça va être Patrick, et comme ça, ça
00:53:45 :va toujours être lui, bah là c'est un peu ça, c'est Foo, donc plutôt que de se direque de faire du test ou de je sais pas quoi, on l'appelle Foo. Après par contre, ce que
00:53:53 :je veux dire c'est que c'est une convention et c'est vraiment juste pour des exemples,par contre args et quarks on le voit bien plus souvent dans les signatures des fonctions,et comme je vous dis vous pouvez les appeler autrement mais je ne vous conseille pas.
00:54:08 :J'essaie vraiment de réfléchir à un autre cas de figure, je sais que des fois j'ai déjàvu des data ou des params ou des trucs comme ça, et je crois, je me demande si, je medemande si d'ailleurs on ne peut pas en mettre plusieurs, et si c'est pas un truc comme ça
00:54:22 :je sais plus. Il me semble que c'était des cas de figure où il y avait déjà des argset des quarks, on voulait en rajouter, enfin il y avait un truc qui allait pas avec les,enfin qui fait qu'on pouvait pas utiliser args et quarks et du coup on utilisait d'autres
00:54:37 :termes, c'était des trucs comme ça, mais j'arrive plus à me souvenir. Donc voilà,je sais pas si c'est un peu plus clair Gabriel, ça fait beaucoup de choses, beaucoup de concepts,d'éléments, mais je pense que... Très très bien, vous voyez mais je l'utilisais
00:54:51 :vraiment et je mettais une explication comme ça et du coup là c'est nickel. Ouais c'estça, faut vraiment, je pense que, moi c'est pareil en fait, au début je comprenais pas,je me disais bon ok c'est bizarre, parce qu'en fait les premières fois que je l'ai vu expliquerjustement on m'expliquait pas l'unpacking, donc des fois en fait je tombais exactement
00:55:09 :dans ces trucs là, des fois je me disais ah je sais plus s'il faut mettre des astérisquesici, là je me disais bon ok là je sais plus, donc au final à chaque fois je mettais desastérisques partout, j'en mettais là, j'en mettais là, et je me disais bon ça marche,
00:55:19 :mais je sais que des fois dans les codes je voyais des gens qui les mettaient comme çadonc je me disais bah pourquoi et je comprenais pas. Donc du coup voilà, le premier truc
00:55:27 :à comprendre c'est vraiment ce truc d'unpacking, est-ce qu'on déballe les choses parce qu'ona besoin de les déballer et de les envoyer séparément ou est-ce qu'on envoie le dictionnaireen tant que tel comme on l'a fait ici où là on comprend bien qu'on envoie le dictionnaireet qu'on a pas besoin de déballer les choses. Ça c'est vraiment première chose. Deuxième
00:55:44 :chose après c'est qu'une fois qu'on a compris le fonctionnement, je comprenais pas trop,en fait je comprenais que c'était utilisé dans la surcharge donc là encore j'utilisaisun petit peu comme ça en me disant bon ok si tu surcharges quelque chose tu te posespas de questions, tu mets les args, les quarks etc, pareil, je cherchais pas trop à comprendre,
00:56:01 :ça marchait. Après j'ai compris, parce que justement j'ai eu des cas de figure où jeme disais ah merde mais en fait là il faut que j'ai accès à ça ici et je me disaisah mais c'est pour ça qu'il faut mettre les args et les quarks, parce que fondamentalement
00:56:13 :dans Django tu peux, si tu fais l'exemple dans Django, tu peux ne pas mettre les argset les quarks ici et ça va fonctionner. C'est juste que vraiment si à un moment dans ton
00:56:21 :save ici tu veux modifier ces méthodes là, bah là ça marchera plus. Je vais vous montrer,j'ai un base model, moi c'est ce que j'ai fait récemment là. Donc j'ai un base model,
00:56:34 :vous voyez ici, attributes, c'est un petit peu le bordel, il faut que je refactore, maislà en fait vous voyez je pars, donc ça c'est un truc que j'ai fait pour les articles deblog, j'ai pas mal de choses à parser, beautiful soup, c'est un petit peu le bordel pour que
00:56:47 :ça soit bien comme il faut, et là vous voyez en fait dans ma fonction de parse, je passele beautiful soup et après je passe pas mal de choses ici. Code blog, headings, copy code,
00:56:57 :donc je veux qu'en fonction en fait, parce que c'est la même méthode qui est utilisée,que ce soit un article de blog, un article de glossaire, un énoncé de quiz ou des trucscomme ça, et donc le truc c'est que des fois en fait le copy code j'en ai pas envie, par
00:57:10 :exemple dans des exercices de code j'ai pas envie que vous ayez le petit bouton qui permetde copier du code, ou le headings c'est les h1, h2, des fois je veux pas qu'ils soientmis en forme, donc par défaut tout est à true, mais dans des cas de figure en fait
00:57:23 :je vais les passer à false. Et le truc c'est que là vous voyez bien que, moi en fait jevais appeler render contents, donc c'est cette méthode ici que je vais appeler, je vaisfaire par exemple blog post.render contents. Et ici en fait justement je vais dire, pour
00:57:38 :le blog post, le vrai truc que j'utilise quasiment tout le temps c'est le attribute.Donc ça je veux qu'il soit vraiment visible, par défaut c'est sur markdown content, maispar exemple ici je pourrais dire, bah en fait je veux que tu rendes la description, je veuxdire attribute égal description, donc je veux que ce soit cet attribut, l'attribut description
00:57:56 :du blog post que tu mets en forme, par défaut c'est le markdown content. Et après, doncça je l'ai mis en dur, j'aurais pu le mettre en args et quarks aussi, j'aurais pu enleverça et là juste faire un quarks attribute, ça aurait marché aussi. C'est juste que
00:58:11 :là si on le met pas ici c'est un peu caché vous voyez, c'est qu'il faut qu'on aillevoir dans la fonction qu'on regarde ici pour dire, ah ok là il utilise un attribute, okqu'est-ce qu'il fait, qu'est-ce que c'est, pourquoi. Donc là en fait je veux que clairement
00:58:25 :il soit indiqué ici que ok par défaut tu vas rendre le markdown content mais qu'onpeut en donner un autre si on veut. Par contre après j'ai mis args et quarks ici et je les
00:58:36 :passe en fait ici à mon parseur. Et là vous voyez ça permet de rentrer à d'autres niveaux,c'est à dire que ici moi dans mon render content je vais pouvoir accéder du coup àcette méthode ici, c'est à dire que dans mon render content je vais pouvoir lui dire
00:58:51 :bah lui en fait le copy code tu le mets à false. Et là vous voyez c'est ce que je vousdisais, on revient au truc je passe le long de la chaîne, donc l'attribute il va bienrécupérer dans l'attribute, je veux dire tu rends la description, et le copy code
00:59:04 :il va le récupérer dans le quarks, et ici je vais passer le quarks. Donc là en faitce qu'on va faire c'est tout simplement mettre le copy code égal à false. C'est
00:59:13 :exactement comme si on faisait ça en fait ici. Donc voilà, et ça vous voyez c'estvraiment parce que j'ai pas envie à chaque fois imaginer que ici en fait, moi j'aijuste envie de changer ça ici, imaginer je rajoute quelque chose, je veux dire parexemple maintenant tu vas avoir, je sais pas, remove headings, un truc comme ça, true,
00:59:38 :bah là vous voyez j'ai rien besoin de changer, j'ai pas besoin d'aller ici dire ok doncmaintenant tu vas pouvoir aussi prendre un remove headings qui est à true, tu vas devoirle passer ici aussi, donc remove headings égal remove headings, vous voyez à chaquefois ce sera un petit peu chiant de devoir faire cette chaîne, de dire bon bah faut
00:59:55 :que tu puisses le définir ici parce que c'est cette méthode finalement que t'appelles,là d'ailleurs vous profitez pour voir que justement le coude est tiré du bas, c'estça, moi le parse en fait je veux jamais l'appeler, je vais toujours passer par le render content.
01:00:08 :Donc ça c'est une méthode privée parce que je vais jamais traiter directement lachaîne de caractère, je vais passer par render content en lui disant certains attributs,en lui disant bah voilà là tu vas rendre la description et tu vas pas mettre le copycode, mais je veux pas aller mettre les mains dans le parse, donc ça c'est la logique
01:00:26 :interne de la fonction, mais je veux pouvoir lui passer des choses, et donc c'est commeça que je fais, et j'ai pas envie à chaque fois de, dans tous les endroits, et ça pourraitêtre imaginé que dans le beautiful soup aussi ou le self HTML ici, on passe aussi des éléments,
01:00:39 :imaginez qu'on mette un quarkz ici aussi, bah j'ai pas envie à chaque fois d'avoirà vous voyez à changer les signatures des fonctions partout, donc là on met un quarkzet comme ça peu importe ce qu'on rajoute ici, je vais pouvoir le passer le long dela chaîne. Voilà donc un petit exemple très concret sur docstring de comment je l'ai
01:00:57 :utilisé récemment. Et du coup le send mail, pareil send mail ici, voilà c'est ce queje vous disais, les headers quarkz, voilà attribute quarkz, oui c'est exactement ceque je vous disais, update user, email, quarkz, et là en fait voilà ça c'est un bon exemple,c'est pour changer sur sendinblue, par exemple pour avoir une synchronisation, si vous changez
01:01:21 :votre prénom sur docstring pour que ça change le prénom du contact sur sendinblue, bahlà les attributes ça peut être n'importe quoi, ça peut être, bon il y en a pas énormémentmais imaginez ça peut être votre prénom, nom de famille, des trucs comme ça, si j'enrajoute par la suite, bah ça pourrait être autre chose, donc là j'ai pas envie à chaque
01:01:38 :fois de changer, je veux juste que quand il y a des choses qui sont modifiées, bahje puisse les passer à cet update user info, et du coup je vais dire update user info,je vais dire bah là tu vas changer le firstname et tu vas mettre Gab, voilà. Et une autre
01:01:55 :fois ça va être phone number ou je sais pas quoi, et vous pouvez changer les infoscomme ça. Et moi je vais juste lui passer le quarkz dans les attributes et j'ai rien
01:02:03 :besoin de bouger, alors que sinon faudrait que je dise, là pareil faudrait qu'on mettefirstname, hop, égal à firstname, phone number, donc à chaque fois faudrait changerles choses, là j'ai rien besoin de changer. Ok? Bah voilà du coup ça fait le tour de
01:02:21 :ce que je voulais dire, je vais vous mettre un petit peu tout le code, je vais essayerde le cleaner un petit peu et de vous mettre ça dans la rediffusion pour que vous puissiezavoir accès. Et voilà, y'a des questions? Non ça va? Hop. Alors, ça va, ok, suivant.
01:03:00 :Bravo si vous avez tout suivi, c'était beaucoup de choses. Ah oui oui j'ai vu Gab,oui oui je voulais répondre. J'ai fait un tweet là dessus, pour ceux qui me suivent
01:03:15 :sur twitter, j'en ai parlé, parce que je me demandais, je me rendais compte, persoje l'utilise aussi de plus en plus, en fait avant j'étais un petit peu sceptique, jeme disais bon ok il répond à côté de la plaque, une fois sur deux, donc en fait t'esjamais trop sûr de ce qu'il dit etc. Ah c'est tout à fait Raphaël, bah super t'es là
01:03:29 :je vais pouvoir répondre, je répondrai aussi par message pour les autres, enfin par texte.Et en fait, donc là de plus en plus j'utilise, parce qu'effectivement, même sur des trucs,c'est ça qui est assez fou, même sur des trucs, comme je disais sur twitter, justementdes librairies un peu pas trop connues, ou des trucs comme ça, AlpineJS, là c'est pas
01:03:48 :une très très grosse librairie, je cherchais des trucs dans la doc, et c'était au delàde la doc en fait, la doc elle vous dit, elle vous dit bon bah voilà si tu utilises xdataégal à machin ça te permet de définir des variables avec des valeurs etc, donc c'est
01:04:03 :un truc très doc, quoi ça vous dit comment ça fonctionne, mais ça vous dit pas forcémentcomment l'utiliser, y'a pas d'exemple. Et moi j'avais un truc très précis où je me
01:04:11 :disais bon bah voilà je sais qu'il faut que j'utilise xdata, xinit etc, mais j'ai du malà comprendre comment les agencer les uns avec les autres, donc je lui dis voilà est-ceque tu peux me dire, je pensais faire comme ça etc, et là effectivement il me sort un
01:04:24 :code, et justement au début j'étais assez sceptique de me dire bon en fait il me sortun code qui est beau, avec pas de faute de syntaxe, que si je connais pas le truc jeme dis ok ça peut marcher, mais après tu le mets et ça marche pas. Effectivement souvent,
01:04:39 :enfin j'avais fait quelques tests et c'était souvent des trucs un peu comme ça, ça m'avaitfait le coup des fois avec Python où justement je lui disais des trucs assez cons comme justementPython, qu'est-ce que je disais, ah oui sur des variables je disais voilà qu'est-ce qu'uneconstante en Python, voilà c'était ça. Et il me disait voilà une constante c'est une
01:04:54 :variable comme ça, et il me disait une constante on peut pas la modifier, et donc ça je disaisbah en fait non avec Python tu peux la modifier, dans d'autres langages de programmation effectivementet c'est là que tu vois qu'en fait il s'est un petit peu mélangé, donc sur du code complet
01:05:05 :je me disais voilà sur des trucs comme ça en plus des petites librairies c'est probableque ça fonctionne pas trop. Et en fait non franchement des fois effectivement il est
01:05:12 :complètement à côté de la plaque mais tu t'en rends compte assez vite, tu mets lecode, tu regardes, ça marche pas, mais des fois effectivement il me fait des trucs etje me dis wow ok c'est vrai que ça fonctionne. Et du coup alors ce que je disais sur Twitter
01:05:26 :c'est que ça reste en fait, je réfléchissais en fait à tout ce que je fais dans la journée,ça reste exactement le travail que je fais quand je cherche sur Google ou de la documentation,c'est une aide, c'est un support qui est incroyable, qui est très cool, qui effectivement
01:05:42 :fait qu'on va plus vite, qu'on se pose moins la tête, c'est pareil avec Github Copilot,des fois je fais des trucs, je me dis ah c'était quoi déjà le truc pour faire telle requêtedans la base de données, je suis plus sûr etc. Donc je lui dis hop je mets un petit
01:05:53 :commentaire, va me récupérer tous les utilisateurs qui ont mis telle notification dans leur profiletc. Et Copilot il se plante souvent, il faut vraiment être très précis et déjà avoir
01:06:02 :un peu de code pour qu'il reprenne les trucs, mais des fois il se plante pas mal aussi,il invente complètement des noms de champs ou des trucs comme ça sur Django, mais bonvoilà ça permet de faire des trucs effectivement plus rapides sur les dates par exemple, c'estgénial aussi, je lui dis récupère moi la date d'aujourd'hui, convertis-la en truc
01:06:22 :et puis voilà, et ça c'est le genre de truc, avant j'allais sur Google parce queje le fais rarement, donc je me souvenais plus est-ce que c'est dateTime, utcna oudateTime je sais plus quoi, je sais plus si c'est pourcentage M, enfin M majuscule,M minuscule, donc voilà, on passe du temps dans la doc et là en fait ça va beaucoup
01:06:37 :plus vite, donc effectivement on code beaucoup plus vite, c'est beaucoup plus agréableparce que c'est pas des trucs super sympa quoi, aller chercher dans la doc pour destrucs qu'on a fait, qu'on fait on va dire 10 fois par an et on se dit à chaque foisputain je savais le faire il y a 2 mois mais j'ai oublié etc, donc en fait on réinvente
01:06:54 :la roue, donc voilà c'est très pratique pour ça, mais au final mon boulot n'a paschangé, donc c'est exactement là encore ce que je dis sur Twitter, c'est je restela personne qui connecte tous les points et c'est moi qui vais dire j'ai besoin deça, j'ai besoin de ça etc, et oui donc Gab en fait les exemples qu'on voit il y a
01:07:14 :des mecs et c'est vrai que c'est impressionnant, il y a des mecs qui font carrément un sketch,donc ils font un petit dessin d'une application et ils disent fais moi l'application, etdonc le truc il arrive à dire ok bon bah là il a fait un gribouillis, c'est ça la
01:07:27 :version 4 de GPT, il arrive à prendre des images en input, donc là le GPT arrive àprendre un croquis, il regarde, il voit un petit gribouillis comme ça etc, il dit okça de ce que je sais ça ressemble à un bouton, donc hop on va lui faire un bouton,
01:07:42 :donc après il fait un bouton HTML, donc hop il a compris, donc c'est vrai que c'estassez fou quand on y pense, il voit un gribouillis, il comprend que c'est un bouton, après avectout ce qu'il a vu, bah justement il comprend qu'un bouton en HTML c'est button machin
01:07:55 :etc, il met le truc et il peut te faire ça et à la fin tu as une interface qui fonctionne.Et effectivement après sur des sites vitrines comme ça par exemple, même si tu as du codequi est pas mal, effectivement, bah tu as un site fonctionnel, le code peut être bien
01:08:14 :et c'est un peu ce qu'on voit en ce moment, c'est qu'avant tu avais des trucs où desfois ils utilisaient du vieux CSS etc, à la limite j'ai envie de dire on s'en foutpourquoi pas, si c'est du vieux CSS mais que ça marche, on s'en fout, après ça peut poser
01:08:25 :d'autres questions et c'est là où justement je m'en vais, c'est que ça reste un trucqui exécute et que le jour en fait il va avoir cette capacité de réflexion et çareste des applications très simples aussi. Un site vitrine, je vois juste sur docstring
01:08:41 :qui est pas un truc ultra complexe, bah en fait ce que je fais et ce que je faisaissur le système de notification, il y a encore quand même beaucoup de choses où voilàet même en fait si on arrive à un GPT qui arrive à tout coder, c'est un peu comme le
01:08:55 :no code, je trouve que c'est peut-être une bonne analogie à faire, où quand il y aeu le no code qui est arrivé tout le monde s'est dit oh là là il y aura plus de développeursparce que les gens vont pouvoir prendre des boutons etc, ils ont plus besoin d'écrire
01:09:06 :de lignes de code, mais en fait ça a rien changé, c'est une autre façon de faire ducode et effectivement ça n'a pas du tout, il n'y a pas moins de développeurs avec leno code, c'est plus qu'en fait il y a des gens qui avant faisaient pas du code, qui
01:09:18 :le font maintenant parce qu'ils peuvent ne pas avoir à coder et c'est plus accessiblepour eux, parce que ça leur fait moins peur etc. Mais finalement j'ai souvent parlé avec
01:09:27 :des gens qui ont des agences de no code, ils me disent les gars qui font des applicationscomplètes, vraiment des gros sites e-commerce etc en no code, c'est même presque plus complexeque du code parce que c'est des usines à gaz avec des nœuds dans tous les sens, des
01:09:41 :trucs logiques etc, et en fait la logique elle est encore là, c'est plutôt que defaire avec un if etc, vous mettez un cube avec une flèche qui dit si machin truc, maisc'est pareil c'est du code en fait et ce qui est derrière c'est la logique. Donc pour
01:09:54 :l'instant moi en tout cas je trouve que c'est, comment dire, que voilà il peut faire desgrosses parties mais même sur un petit site comme DuckString il faudrait vraiment quelqu'unqui continue à lui dire ok je vais faire ça, je vais faire ça, je vais faire ça.
01:10:09 :Donc voilà, effectivement ça se peut que ça enlève du travail de base par exemplesur les tests, c'est sûr que, enfin je sais pas, pour l'instant moi je le vois plus commequelque chose qui fait que tout le monde va 10 fois plus vite que avant, bah effectivementpeut-être qu'un junior on allait lui donner des tests à faire et que maintenant bah en
01:10:25 :fait JPT va le faire donc on a plus besoin d'avoir un junior qui va faire les tests,mais est-ce que ça veut dire pour autant qu'on va pas embaucher le junior? Bah non,
01:10:32 :je pense qu'on va continuer à l'embaucher et c'est juste qu'on va lui dire bah voilàassure-toi que le truc fait bien les tests, fait autre chose, enfin voilà, pour l'instantmoi ça m'inquiète pas trop, je trouve que voilà c'est, oui The Crow, oui effectivementon avait fait une vidéo avec Paname là-dessus.
01:10:52 :Donc voilà, moi pour l'instant, en fait j'ai envie de vous dire que le jour où vraimentça arrive à avoir un impact significatif sur le, vraiment, je parle de significatif,c'est pareil avec Midjourney, c'est le truc des illustrations, je me pose un peu plusla question là-dessus parce que c'est quand même assez fou ce que ça fait et toutes
01:11:15 :les images que vous voyez sur Duck String là en ce moment c'est effectivement, j'aipas payé un illustrateur pour le faire donc là vous voyez je me dis, mais en même tempsc'est ça qui est marrant, c'est que j'ai pas payé un illustrateur pour le faire, maisça fait 3 ans que je payais pas non plus un illustrateur pour le faire, donc c'est
01:11:28 :pas qu'avant je payais quelqu'un pour faire les images et maintenant je lui ai dit byebye c'est bon et il a perdu son boulot, c'est plus que ça me permet d'avoir des imagesfacilement pour, je crois que ça coûte 30 balles par mois, alors qu'avant, bah voilàj'aurais pas payé 700 euros par illustration à un illustrateur, donc en fait voilà, de
01:11:45 :base je payais, j'avais pas les moyens pour payer un gage juste pour faire les illustrations.Donc je me dis c'est pareil en fait, enfin c'est un peu ça.
01:11:53 :Et pour finir là dessus, j'ai envie de vous dire que le jour où vraiment on a sensiblementmoins de développeurs, je parle même pas forcément de genre le métier est complètementremplacé, mais même si on avait un impact significatif qui fait que je sais pas, ona besoin de 80% de moins de développeurs, ce qui me semble assez improbable déjà parce
01:12:15 :que comme je vous dis en fait il y a d'autres usages qui se font et on va faire d'autreschoses et comme dit je sais plus qui ici j'ai vu, il faut des gens aussi qui vontcoder, chat gpt etc, donc en fait c'est d'autres métiers qui vont apparaître.
01:12:25 :Là on voit sur Midjourney des gens qui sont des illustrateurs qui maintenant retouchentdes images qui sont faites par Midjourney, donc ça c'est un truc qu'on avait pas besoinà faire avant parce qu'il y avait personne qui faisait des images avec Midjourney.
01:12:35 :Et maintenant on a des gens qui avant faisaient de l'illustration qui maintenant retouchentl'illustration, donc finalement il y a un nouveau usage qui a été créé avec quelquechose, donc vous voyez en fait je trouve que ça va ailleurs, il y a des emplois desfois qui sont détruits, il y en a d'autres qui sont créés, il y en a d'autres qui
01:12:48 :sont transformés et désolé je divague dans tous les sens, mais pour finir là dessus,le jour où vraiment il y a 80% des développeurs qui ont plus de boulot, je pense qu'en faitles développeurs c'est quand même un métier encore très qualifié, le jour où il y aça, ça veut dire que les avocats, les gens qui font des analyses en laboratoire, quasiment
01:13:14 :tous les métiers intellectuels que vous pouvez penser, je sais pas, oui c'est ça, des notaires,enfin je sais pas, tous les métiers où t'as des gens sur des ordis qui font des trucs,et même au delà comme je vous dis, même des métiers d'analyse ou des trucs commeça, ça veut dire que ChildGPT voudra le faire. Et donc je pense qu'en fait à ce
01:13:30 :moment là, on sera pas les seuls concernés, ça va poser des questions, bon là on rentrevraiment presque dans des débats politiques et tout, mais je pense que voilà, ça poserades questions où, bah voilà, en un an il y a 80% des gens, pas juste dans les développeurs
01:13:43 :mais en fait dans tous les métiers quasiment, où les gens auront plus de boulot. Donc làen fait, imaginez d'un coup, boum, il y a 80% de chômage, je pense que voilà, il yaura d'autres questions et d'autres sujets qui vont arriver, plus que genre, ah merde,est-ce que j'ai bien fait de faire du code, alors que je pense que la question se pose
01:14:04 :pour n'importe quoi, si vous voulez faire n'importe quel, apprendre n'importe quoiaujourd'hui, il y a un risque, ou alors si vraiment vous voulez pas avoir de risque,j'ai envie de vous dire, devenez coiffeur, parce qu'effectivement à la limite c'estpeut-être les coiffeurs ou agriculteurs ou des trucs comme ça, parce que c'est encore
01:14:20 :finalement des trucs manuels, ou d'ici à ce qu'on ait un robot qui puisse vous couperles cheveux comme ça, c'est probablement plus compliqué. Et aussi par rapport à ce
01:14:29 :que je disais sur Twitter, moi je me demande en fait quel est le gap, j'ai l'impressionque là, aussi incroyable que tout ce qu'on voit avec JGPT etc, je me dis que le gapen fait entre ce qu'on avait avant, c'est à dire juste des séries, des intelligencesartificielles qui étaient assez bêtes et pas très utiles, et ce qu'on a aujourd'hui
01:14:48 :qui semble être un saut incroyable, je me dis que le saut technologique entre du coupchat JGPT, qui est ce truc incroyable, on lui parle, il peut faire ce qu'il veut etc,enfin JGPT même juste et pas le chat, et vraiment ce qui serait vraiment l'évolutionqui ferait qu'il y aurait plus besoin de développeurs etc, c'est à dire une intelligence
01:15:07 :artificielle qui est pas juste capable d'exécuter, mais de se dire ok, on lui dit fais moi unsite web et c'est tout, juste en lui disant ça et après en lui passant un client, ellepeut tout remodeler, tout faire etc, penser comment il faut faire etc, se remettre en
01:15:21 :question etc, donc là on serait vraiment à une intelligence, j'ai l'impression quece saut là, peut-être vu que c'est exponentiel ça sera assez rapide, mais j'ai l'impressionque c'est peut-être 10 fois plus difficile que le saut technologique qu'on a eu entreJGPT et JGPT. Donc voilà, et effectivement Salvatore il y a aussi la question des données,
01:15:40 :il y a la question des, oui effectivement, que pour l'instant le truc est nourri partout ce qu'on a créé auparavant, donc finalement est-ce qu'on peut avoir un truc qui s'auto-nourrit,qui crée du nouveau contenu, voilà encore on parle dans des sujets, je vais m'arrêterlà parce que je pourrais en parler des heures, mais est-ce que ces intelligences artificielles
01:15:58 :pourraient se nourrir du propre contenu qu'elles ont créé, parce que finalement si on seposie que c'est un petit peu édulcoré finalement, enfin voilà, le mot de la fin, mais quandon a des gens qui font de la peinture et qui d'un coup arrivent avec un truc qu'on n'avait
01:16:13 :jamais vu avant, ben voilà c'est ça le génie un peu, maintenant ça nous semble, on voitdes gens qui font du pointillisme, on se dit bon bah oui, le gars à un moment il s'estdit je vais faire plein de points au lieu de faire des lignes, ok j'aurais pu y penser,
01:16:26 :mais en fait à l'époque c'était wow, le gars il a pensé à faire des points, personnen'a pensé, donc est-ce qu'à un moment on a une intelligence artificielle qui va pouvoirsortir un truc nouveau comme ça, on se dit wow ok, probablement, et il y a des fois des
01:16:36 :trucs comme ça qui arrivent où ils font des trucs auxquels on n'avait pas pensé, c'estmarrant, mais bon, voilà voilà. Donc je sais pas si ça répond à tes questions Raphaël
01:16:45 :et tout, mais bon pour l'instant moi je le vois vraiment comme un truc où il ne fautpas en avoir peur, il faut vraiment l'utiliser, j'ai beaucoup d'amis dans les arts etc. qui
01:16:53 :veulent absolument pas en entendre parler, je trouve que c'est un petit peu une erreurparce que je pense que c'est comme n'importe quel outil en fait, il faut apprendre à lesmaîtriser, et je sais pas, c'est un peu oui, penser à n'importe quel truc technologique,et il y a plein de gens qui font ce parallèle là, j'ai vu des trucs passer sur Twitter
01:17:09 :aussi avec la voiture par exemple, quand la voiture est arrivée les gens qui disaientah quelle abomination, il faut continuer à être sur un cheval parce que les voituresça tue des gens, et si on commence à utiliser des voitures c'est la fin de l'humanitéparce que tout le monde va mourir écrasé, et puis il y a des gens qui se sont dit oui
01:17:22 :en fait si on fait gaffe et qu'on roule pas trop vite, c'est juste trop bien et on peutaller plus vite d'un point à un point, et finalement les gens qui ont vu ça, ils allaientplus vite.
Aucune occurrence trouvée pour « ».
00:00:24
Explication des changements et améliorations
00:02:48
Introduction aux args et kwargs
00:04:22
Exemples et théories sur les args et kwargs
00:09:05
Différence entre arguments nommés et non nommés
00:10:10
Unpacking en Python
00:16:01
Utilisation pratique du unpacking
00:23:24
Surcharge de méthode et héritage en Django
00:28:00
Exemple pratique avec Django et SendinBlue
01:02:32
FAQs et clarifications sur les args et kwargs
01:11:14
Impact des IA sur le travail des développeurs