flotpython / course

Contenu pédagogique du MOOC Python3 sur fun-mooc.fr
Other
130 stars 22 forks source link

Match case #66

Closed Karduin closed 1 year ago

Karduin commented 1 year ago

Bonjour Thierry,

Une proposition pour une première partie au sujet de match / case. Je ne sais pas trop comment tu veux organiser ça. J’ai mis le fichier dans la semaine 4. Je pensai faire ça en deux parties, et donc une deuxième partie pour les cas plus complexes. Je n’ai pas traduit structural pattern matching je ne vois rien d’élégant pour mettre ça en français.

Dis-moi si ça t’intéresses que je continue ou si tu vois les choses différemment. N’hésites pas à me dire que ça ne convient pas, je ne vais pas me vexer.

Cordialement,

Jean-Michel

parmentelat commented 1 year ago

bonjour Jean-Michel

écoute oui ça va tout à fait dans le bon sens j'ai regardé rapidement, sans doute je ferai de petites corrections à la marge mais rien de lourd

je ne sais pas non plus trop où le mettre l'étape suivante ça va être de parler des instances de classe, c'est bcp + épineux, et il faut avoir vu les classes avant donc puisque tu évoques une deuxième partie il faudrait la viser dans la section 6 peut-être (et rédiger la première partie pour dire qu'on reverra le match plus loin)


en termes de licence, tu peux très bien ajouter ton nom hein, c'est quand même le minimum :)

sinon je crois que oui mais ne me souviens plus à 100%, le python dispo dans les notebooks a la bonne version pour faire tourner tout ça ?

en tous cas merci ça aide :)

parmentelat commented 1 year ago

pour info toujours mais on a commencé à évoquer vaguement l'idée de retourner quelques vidéos et ce sujet-là fait partie du top 2, avec le walrus operator...

Karduin commented 1 year ago

Merci Thierry,

sans doute je ferai de petites corrections

Pas de soucis, c'est bien normal.

J'ai quelques petites interrogations en vrac.

parmentelat commented 1 year ago

entre tes deux options, j'ai une préférence pour la première option (2 notebooks en tout, un en semaine 4 et un en semaine 6) sachant qu'il faut que chacun conserve une taille 'raisonnable' (je ne suis pas sûr d'avoir à chaque fois respecté cette consigne, mais c'est important que chaque notebook reste relativement digeste) on n'est pas obligé de décrire tous les cas de coin et tout hein, ce n'est pas une doc de référence, sur la base de quelques exemples les gens sont normalement capables d'élaborer

on peut mentionner le cas des floats à mon avis, sur juste un exemple qui soit pathologique

pour la réf à kaamelott, je pense pas que le copyright pose problème, mais on peut se demander en effet ce que va comprendre quelqu'un qui n'a pas le background; à toi de voir :)

PS. il faudrait aussi modifier à l'occasion dans l'entête le 'notebookname' et le mettre à 'instruction match (1/2)' ou quelque chose dans ce genre

Karduin commented 1 year ago

Voila, je pense que c'est bon pour la première partie. Je ne suis pas suffisamment calé en math pour un exemple sur les floats. Modifie ce que tu veux.

parmentelat commented 1 year ago

Merci Jean-Michel

je garde ça sous le coude, j'éditerai à l'occasion :)

parmentelat commented 1 year ago

J'ai retravaillé un peu le premier match_case.md

par contre j'ai tout rebasé, c'est plus simple je pense si tu repars de la branche match_case mais depuis mon repo

ça va demander un peu de gymnastique avec git, dis-moi si tu as besoin d'aide pour ça

merci !

PS. de manière générale c'est plus simple pour moi si, lorsque u veux 'rattraper' mais tu rebases plutôt que de merger, c'est plus simple comme ça d'isoler vraiment ce qui est dans ta branche par rapport à ce qui a été fait dans main entretemps; je sais pas si c'est clair, là encore je peux éclaircir si besoin

Karduin commented 1 year ago

Bon tu m'as un peu perdu là. ;-)

Quand tu auras le temps, je veux bien un éclaircissement sur le fait de rebaser plutôt que merger.

ça va demander un peu de gymnastique avec git, dis-moi si tu as besoin d'aide pour ça

Ce ne serait pas plus simple si je supprime mon fork et que je le refasse du coup ?

parmentelat commented 1 year ago

On 19 Apr 2023, at 13:21, Karduin @.***> wrote:

Bon tu m'as un peu perdu là. ;-)

Quand tu auras le temps, je veux bien un éclaircissement sur le fait de rebaser plutôt que merger.

ça va demander un peu de gymnastique avec git, dis-moi si tu as besoin d'aide pour ça

Ce ne serait pas plus simple si je supprime mon fork et que je le refasse du coup ?

— Reply to this email directly, view it on GitHub https://github.com/flotpython/course/pull/66#issuecomment-1514561383, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABCPKO5LAPYRI634VYPWPHLXB7DCNANCNFSM6AAAAAARGLELHU. You are receiving this because you commented.

Bonjour Jean-Michel

je comprends que c’est un peu olé olé :-)

je suppose dans la suite que

ton repo est ‘propre’ - pas de modifes pendantes - à committer ou à stasher si nécessaire ça c’est super important bien sûr ton remote origin pointe vers mon repo (sinon tu remplaces origin par le bon nom) tu as une remote ‘mine’ qui pointe vers ton fork; pareil tu remplaces par le bon nom...

ce que tu peux faire pour te remettre en phase, c’est juste ceci

pour te remettre sur la branche en question

git switch match_case

pour aller chercher ma branche

git fetch --all

à ce stade tu auras une référence origin/match_case

et là tu téléportes ta branche sur la mienne

git reset --hard origin/match_case

ya plus qu’à pousser sur ton fork

git push --force mine match_case:match_case

ce qu’il y a de bien avec cette façon c’est que le PR reste valide et on peut continuer à drafter le nb #2 mais si jamais ça foire de ton coté, ou si tu le sens pas, no worries, tu pourras toujours refaire ton fork en effet simplement dans tous les cas repars bien du commit d1ba5bd où il y a tout ce qu’il faut

désolé si c’est compliqué…

—— le principe de rebaser, c’est qu’au moment de rattraper main, au lieu de faire juste git pull, on fait git pull --rebase, ce qui au lieu de merger, va refaire les modifes de la branche mais au-dessus du main, comme ça on se fait moins de noeuds au cerveau pour visualiser les changements qui sont propres à la branche, vs ce qui a changé dans le main entretemps…

cad on obtient finalement un fil tout simple au lieu d’avoir des schémas en diamant

Karduin commented 1 year ago

Bonjour Thierry,

Ce que j’avais fait pour proposer les pr :

Puis je modifie en local je push sur mon repo et pr à partir de github.

Du coup origin pointe sur mon repo.

Du coup je ne pointe pas sur ton repo. Je peux quand même faire la manip que tu indiques ?


Concernant match case et les classes :

Tu pense à des choses dans ce genre ? Parce que j'avoue ne pas trop savoir comment traiter le sujet.

class Vars:
    x = int(input())
    y = int(input())
    z = int(input())
match Vars.x:
    case Vars.y:
        print("something")
    case Vars.z:
        print("anything")
parmentelat commented 1 year ago

ah ok, alors je rephrase les manipes à faire

git remote add upstream git@github.com:flotpython/course.git git fetch --all git switch match_case git reset --hard upstream/match_case git push --force origin match_case:match_case

parmentelat commented 1 year ago

au départ je pensais plutôt à quelque chose comme ce qui suit, mais c'est très ouvert

je suis pas non plus un expert de ce trait qui est très récent et que je commence seulement à utiliser il ne faut pas hésiter à s'inspirer de trucs déjà existants

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

# ça ne marche sûrement pas tel quel, mais en gros hein

def foo(p):
    match p:
         Point(0, 0):
              print("le zéro")
        Point(x, 0):
              print(`horizontal, {x=}`)
        Point(x, y):
              print(`ailleurs {x=} {y=}`)

zero = Point(0, 0)
p1 = Point(0, 5)
p2 = Point(5, 5)

foo(zero)
foo(p1)
foo(p2)
parmentelat commented 1 year ago

c'est parfait comme ça on est bien en phase

c'est quoi du coup le plan pour la deuxième partie ?

on peut très bien dans un premier temps publier juste ça (peut-être du coup enlever le 1/2 et la phrase à la fin qui dit que ça continue en semaine 6) et remettre à plus tard (ou pas) la deuxième partie.

dis-moi

Karduin commented 1 year ago

c'est parfait comme ça on est bien en phase

Oui merci pour la manip, ça a marché impeccable.

J'avoue que je n'avais pas d'idée précise en tête et que je comptais sur toi ;-). Il faut que je creuse la question en fouillant sur le net.

Du coup si tu as une dead line courte il vaut mieux partir sur la publication de la première partie.

Dans tous les cas je vais chercher de l'info dès à présent.

EDIT:

Bon en écrivant le code comme ça, ça fonctionne : (voir PEP 636) bien que leur exemple soit avec une dataclass. Je ne me souvient pas d'avoir vu quelque chose à ce sujet dans le mooc. (différence ?)

class Point:
    counter= 0
    def __init__(self, x, y):
        self.x = x
        self.y = y
        Point.counter += 1

def foo(p):
    match p:
        case Point(x=0, y=0):
            print("le zéro")
        case Point(x=x, y=0):
            print(f"horizontal, {x=}")
        case Point(x=x, y=y):
            print(f"ailleurs {x=} {y=}")

zero = Point(0, 0)
p1 = Point(0, 5)
p2 = Point(5, 5)

foo(zero)
foo(p1)
foo(p2)

print(Point.counter)

J'ai rajouter un compteur parce que la façon de comparer me paraissait étrange, mais il ne compte bien que trois instances.

parmentelat commented 1 year ago

je n'ai pas de deadline; je voulais juste dire que si tu ne te sens pas d'écrire la 2ième partie on peut tout à fait se contenter de la première :)

si on part sur une deuxième partie: oui voilà, je pense que ça peut être un exemple intéressant (sans le compteur of course, car ça va confuser les gens); on n'est pas non plus obligé d'en écrire des tartines..

-- sinon à propos de dataclass: pourtant si, il y a un notebook sur les dataclass en 6-3-3

Karduin commented 1 year ago

Honnêtement, pour le moment je ne vois comment faire. Donc publions juste la première partie.

Cependant j'ai eu une idée, reste a savoir si elle est pas terrible et si j'arrive à la faire fonctionner.

Dans le notebook, je ne pense pas que l'on puisse faire la requête sans que leur serveur ne pleure. Mais on peux mettre un json à dispo. Si quelqu'un veux faire la manip en local on peux fournir un code de base .

Alors sans intérêt ou pas ?

parmentelat commented 1 year ago

dac pour publier la première partie.. il faut que je trouve 10 minutes pour insérer le notebook dans le cours

pour ton projet, ça semble très intéressant; toutefois c’est clairement un truc qu’on va avoir envie de faire en pandas non ? du coup j’ai du mal à voir le rapport avec le match/case, ça n’existe pas à ma connaissance sous forme vectorisée en pandas ça, si ?

ce qui à nouveau ne doit pas empêcher de faire cet exercice qui semble rigolo; avec un peu de folium dedans ?

mes 2 centimes

On 22 Apr 2023, at 10:55, Karduin @.***> wrote:

Honnêtement, pour le moment je ne vois comment faire. Donc publions juste la première partie.

Cependant j'ai eu une idée, reste a savoir si elle est pas terrible et si j'arrive à la faire fonctionner.

Utiliser l'API de http://www.fdsn.org/webservices/ http://www.fdsn.org/webservices/ pour récupérer des datas sur les derniers tremblements de terre. Il y a une page pour construire la requête https://www.seismicportal.eu/fdsn-wsevent.html https://www.seismicportal.eu/fdsn-wsevent.html. On pourrai filtrer sur les latitudes / longitudes France et toutes magnitudes (par exemple, ou Japon pour plus d'infos). On récupère le json. A partir du json, on fait une list ou un dict d'instances d'une class Eartquake avec juste 3 ou 4 attributs. Et enfin un match case sur les magnitudes par exemple. Ou autre c'est pas encore net pour moi. Dans le notebook, je ne pense pas que l'on puisse faire la requête sans que leur serveur ne pleure. Mais on peux mettre un json à dispo. Si quelqu'un veux faire la manip en local on peux fournir un code de base .

Alors sans intérêt ou pas ?

— Reply to this email directly, view it on GitHub https://github.com/flotpython/course/pull/66#issuecomment-1518568276, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABCPKOZJIQZTXEPRXFODO5DXCOMJ7ANCNFSM6AAAAAARGLELHU. You are receiving this because you commented.

Karduin commented 1 year ago

J'avais un peu peur que tu me répondes quelque chose dans ce goût. C'est plutôt un boulot pour base de données ou Pandas effectivement.

Du coup je vais voir si je peux faire un truc avec les exemples de la PEP636 pour le match case, et voir si je peux réaliser l'exercice avec folium. Je ne connaissais pas, c'est sympa.

Si j'y arrive tu crois que ça peux être intéressant pour le mooc ?

parmentelat commented 1 year ago

le notebook est en ligne sous le numéro 425

pour l'éventuelle seconde partie, ce n'est pas crucial hein

s'agissant de folium enfin, pourquoi pas, mais il faut alors viser quelque chose de super light l'objectif je pense ce serait essentiellement signaler l'existence du truc, et donner une idée de ce qu'on peut faire avec :)

Karduin commented 1 year ago

Nice ! merci.