05:48 <discord_afpy> <foxm4sk> @melcore 💪
07:46 <debnet> Bonjour.
08:54 <z4c> Matin martin !
08:55 <z4c> debnet: alors t'es a Paris pour aller voir Gandi ou pas encore ?
08:56 <debnet> Not yet. J'ai pas eu l'occasion.
09:01 <z4c> Tu le diras histoire de trouver une occasion pour 🍻
10:46 <debnet> Avec plaisir !
12:57 <alain_afpy> L'installation et la distribution de paquets Python (2/4) - https://linuxfr.org/news/l-installation-et-la-distribution-de-paquets-python-2-4
16:12 <discord_afpy> <aster30999> j'écris des dizaines de lignes de codes à cause de cette lacune, et là ça devient de moins en moins lisible
16:33 <misc> de cette lacune ?
16:35 <discord_afpy> <aster30999> mon msg précédent n'est pas passé sur irc ?
16:44 <merwyn> Nope :(
16:55 <misc> en fait, ça devient tellement pas lisible qu'on peut pas lire le message :p
16:59 <discord_afpy> <aster30999> https://paste-bin.xyz/8110980 pour irc
17:03 <misc> mhh
17:03 <misc> donc, tu veux résoudre quel probléme exactement avec ce code ?
17:04 <discord_afpy> <aster30999> ben je veux pouvoir une variable en guise de méthode/fonction
17:04 <misc> (parce qu'une solution serait de changer "profile", pour être un dict)
17:05 <misc> (mais c'est peut etre pas faisable)
17:05 <misc> sinon, y a __call__
17:06 <discord_afpy> <aster30999> non c'est pas faisable. Mais le soucis se pose dans d'autre cas. Dans Django, les éléments de la db sont accessibles via Table.field. Et souvent j'ai besoin d'accéder à plusieurs
17:07 <discord_afpy> <aster30999>
17:08 <entwanne> Tu as la fonction getattr pour accéder à l'attribut d'un objet
17:09 <entwanne> getattr(foo, 'bar') est équivalent à foo.bar
17:12 <entwanne> Et pour un besoin répété tu peux aussi avoir attrgetter du module operator : `get_bar = attrgetter("bar"); (get_bar(foo), get_bar(oof))` est équivalent à `(foo.bar, oof.bar)`
17:15 <discord_afpy> <aster30999> getattr pourrait suffir. Je vais tenter de voir si ça marche avec les classe dans django
17:15 <discord_afpy> <aster30999> merci pour les pistes. Et sinon ce que je veux faire, cad utiliser les éléments d'une liste en tant que méthode, ce n'est pas possibel ?
17:25 <entwanne> Ce n'est pas possible comme tel mais c'est possible avec attrgetter, définir une liste d'objet attrgetter, itérer dessus et les appeler sur tes objets pour obtenir les valeurs des attributs
17:29 <entwanne> ```python
17:29 <entwanne> fields = [attrgetter("graph_machin"), attrgetter("graph_truc")]
17:29 <entwanne> for f in fields:
17:29 <entwanne> if v := f(request.user.profile):
17:29 <entwanne> print(v)
17:29 <entwanne> ```
17:41 <discord_afpy> <aster30999> je comprends pas du tout ta notation
18:03 <Mindiell> c'est du python tout bete pourtant
18:03 <Mindiell> ?ACTION sort de 3j de grippe?
18:04 <discord_afpy> <aster30999> ben j'ai pas le niveau, désolé. C'est comme les boucles for sur une seule ligne, je ne les retiens pas : ni leur nom, ni leur construction ...
18:06 <Mindiell> eh bien, en utilisant attrgetter, il parcourt une liste qui te permet, pour chaque champ (fields) de gérer leurs attributs (graph_machin et graph_truc)
18:06 <Mindiell> et il les print juste
18:07 <Mindiell> ne connaisssant pas attrgeter, j'aurai fait la liste des champs et fait :
18:08 <Mindiell> for f in fields:
18:08 <Mindiell> if v := getattr(request.user.profile, f)
18:08 <Mindiell> mais ça revient au même je dirais
18:08 <Mindiell> (avec fields = ["graph_truc", "graph_machin"])
18:09 <discord_afpy> <aster30999> c'est le := que je ne comprends pas
18:10 <Mindiell> ah
18:10 <discord_afpy> <aster30999> mais j'ai la doc 🙂
18:10 <Mindiell> c'est une notation récente appelée "walrus" (parce que çaressemble aux dents d'un morse)
18:11 <Mindiell> ça signifie que si le test "if" est vrai, alors v est utilisable
18:11 <Mindiell> ça évite le :
18:11 <Mindiell> v = fonction_imporbable(argument_foireux)
18:11 <Mindiell> if v:
18:11 <Mindiell> là tu fias directement :
18:11 <Mindiell> if v := fonction_imporbable(argument_foireux):
18:12 <Mindiell> c'est tout bête et pas obligatoire
18:13 <entwanne> Mindiell: Si le if n'est pas vrai, v est tout autant utilisable d'ailleurs
18:14 <Mindiell> euh
18:14 <Mindiell> mais son scope est limité au if non ? Donc tu l'utiliserais comment ? via un else ?
18:15 <Mindiell> mais sortie du scope du "if", le "v" est nettoyé, on est d'accord ?
18:15 <discord_afpy> <aster30999> ha ouais intéressant, parce que les if dans les if juste pour vérifier un truc, on en consomme
18:16 <discord_afpy> <chadys> de mémoire le "v" ne sera pas nettoyé, comme pour un `for i in [1,2]`, le "i" vaudra bien 2 une fois sorti de la boucle
18:16 <Mindiell> et donc pour reprendre au plus près le code d'aster30999, j'aurais plutôt fait ça : https://wyz.fr/8S-2H
18:17 <Mindiell> ah ben j'en apprends tous les jours, merci !
18:17 <Mindiell> ici le "attrgetter" ne me semble pas apporter grand chose au final (ou alors je vais encore apprendre un truc ? ;o) )
18:22 <discord_afpy> <aster30999> python c'est comme l'anglais : tu sais le parler jusqu'au moment où tu parles avec des gens qui t'apprennes un tas de trucs du quotidien ... et là tu te dis que tu savais pas en fait
18:22 <discord_afpy> <aster30999> merci en tout cas pour le topo, j'ai mon info, et bien plus !
18:24 <entwanne> Mindiell: Non pas du tout, le if ne crée pas de scope
18:37 <Mindiell> entwanne: ben saypabien !
18:37 <Mindiell> :)
18:51 <entwanne> Ouais mais c'est tout le Python qui est comme ça, c'est parfois surprenant mais y a juste class et def qui créent des nouveaux scopes
19:04 <misc> est ce que c'est le moment de parler de notre lord and savior Rust ?
19:10 <debnet> D'ailleurs, y a peu de temps je suis tombé sur cet opérateur en Python ",=" ça vous parle ?
19:10 <debnet> J'avais jamais vu ça.
19:10 <debnet> Je ne sais d'ailleurs pas trop ce que ça fait.
19:12 <misc> je suppose que tu va avoir un truc qui renvoie un tuple de 2 elements, et qui oublie le 2eme ?
19:13 <misc> (ah non)
19:13 <misc> >>> a,=[1]
19:13 <misc> >>> a
19:13 <misc> 1
19:14 <misc> ça unpack
19:17 <entwanne> Ouais, `,=` n'existe pas en tant qu'opérateur, mais la virgule à gauche de l'assignation permet l'unpacking
19:17 <debnet> Ah ouais donc en fait c'est juste que visuellement ça m'a perturbé.
19:17 <debnet> C'est juste un tuple à gauche de l'opérateur.
19:18 <debnet> Python est laxiste sur les espaces.
20:05 <Mindiell> ah oui, et : a,=[1,2,3]
20:05 <Mindiell> ça plante
20:05 <Mindiell> logiquement.
20:05 <Mindiell> a,_,_=[1,2,3] <= hin hin
22:27 <entwanne> j'utilise souvent le `x, = ...`, parfois de la même manière que j'utiliserais un `next(...)` tout en m'assurant qu'il n'y aura jamais + d'un élément, mais y a des linters qui n'aiment pas et demandent à ce que ce soit écrit `(x,) = ...` :(