Skip to content

Conversation

@Karduin
Copy link
Contributor

@Karduin Karduin commented Oct 16, 2022

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
Copy link
Contributor

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
Copy link
Contributor

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
Copy link
Contributor Author

Karduin commented Oct 18, 2022

Merci Thierry,

sans doute je ferai de petites corrections

Pas de soucis, c'est bien normal.

J'ai quelques petites interrogations en vrac.

  • Dans cette partie je n'ai pas abordé le match des tuples, list, groupes, etc.
    • Je rajoute ça à la première partie et on fait une deuxième pour les classes.
    • On fait trois parties : base, avancé (tuples, list, etc), classes.
  • Faire un match sur des floats c'est pas un peu risqué ? faux positif ou faux négatif ? On rajoute un avertissement ?
  • L'exemple que j'utilise pour le pipe en référence à Kaamelott, pas sur que ce soit une bonne idée, il faut avoir la référence et je ne sais pas pour le copyright si ça pose un problème.

@parmentelat
Copy link
Contributor

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
Copy link
Contributor Author

Karduin commented Oct 19, 2022

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
Copy link
Contributor

Merci Jean-Michel

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

@parmentelat
Copy link
Contributor

parmentelat commented Apr 19, 2023

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
Copy link
Contributor Author

Karduin commented Apr 19, 2023

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
Copy link
Contributor

parmentelat commented Apr 19, 2023 via email

@Karduin
Copy link
Contributor Author

Karduin commented Apr 20, 2023

Bonjour Thierry,

Ce que j’avais fait pour proposer les pr :

  • fork de ton repo
  • pull de mon repo en local.

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

Du coup origin pointe sur mon repo.

  • remote origin
    Fetch URL: git@github.com:Karduin/course.git
    Push URL: git@github.com:Karduin/course.git
    HEAD branch: main
    Remote branches:
    jupytext tracked
    main tracked
    match_case tracked
    update-asyncio tracked
    Local branches configured for 'git pull':
    main merges with remote main
    match_case merges with remote match_case
    update-asyncio merges with remote update-asyncio
    Local refs configured for 'git push':
    main pushes to main (up to date)
    match_case pushes to match_case (up to date)
    update-asyncio pushes to update-asyncio (up to date)

❯ git remote -v
origin git@github.com:Karduin/course.git (fetch)
origin git@github.com:Karduin/course.git (push)

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
Copy link
Contributor

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
Copy link
Contributor

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
Copy link
Contributor

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
Copy link
Contributor Author

Karduin commented Apr 21, 2023

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
Copy link
Contributor

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
Copy link
Contributor Author

Karduin commented Apr 22, 2023

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/ 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.
    • 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 ?

@parmentelat
Copy link
Contributor

parmentelat commented Apr 22, 2023 via email

@Karduin
Copy link
Contributor Author

Karduin commented Apr 22, 2023

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 parmentelat merged commit d1ba5bd into flotpython:main Apr 25, 2023
@parmentelat
Copy link
Contributor

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
Copy link
Contributor Author

Karduin commented Apr 25, 2023

Nice ! merci.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants