| @@ -1,6 +1,29 @@ | |||
| % Programmation avec Python (chapitre 7) | |||
| % Dimitri Merejkowsky | |||
| # | |||
| \center \huge Un nouveau mot-clé | |||
| # Les mots-clés | |||
| Des mots qui ne peut être utilisé pour des noms de variales. | |||
| On a déjà vu: `def`, `class`, `import`, etc ... | |||
| # Assertions | |||
| * Arrêter immédiatement le programme avec un message | |||
| * Ressemble à `sys.exit()` | |||
| * Mais usage un peu différent | |||
| # Les assertions sont là pour les dévelopeurs | |||
| * Le message n'aura en général *aucun* sens si c'est un simple utilisateur | |||
| qui le lit. | |||
| * Il indique en général un problème *interne*, dans le code lui-même, | |||
| par opposition aux erreurs *externes* | |||
| Mais on en reparlera :) | |||
| # | |||
| @@ -18,7 +41,6 @@ class Counter: | |||
| ``` | |||
| # Instantiation | |||
| Construire une nouvelle *instance* de `Counter` | |||
| @@ -53,3 +75,268 @@ class Counter: | |||
| >>> counter.count | |||
| 1 | |||
| ``` | |||
| # | |||
| \center \huge Compléments sur les classes | |||
| # Attributs d'instances | |||
| En vrai les attributs qu'on a vu maintenant sont des | |||
| attributs d'instance. Ils sont liés à l'instance courante. | |||
| Mais on dit souvent "attribut" tout court. | |||
| Il existe un autre type d'attribut. | |||
| # Attributs de classe | |||
| Dans le bloc de la classe, mais à l'extérieur des | |||
| blocs de méthodes: | |||
| ```python | |||
| class Car: | |||
| total_number_of_cars = 0 | |||
| def __init__(self, color="black"): | |||
| # attribut d'instance: avec self | |||
| self.color = color | |||
| # attribut de classe: avec le nom de la classe | |||
| Car.total_number_of_cars += 1 | |||
| ``` | |||
| # Attributs de classe - 2 | |||
| Les attributs de classe sont partagés entre toutes | |||
| les instances: | |||
| ```python | |||
| >>> ford = Car() | |||
| >>> ferrari = Car(color="red") | |||
| >>> Car.total_number_of_cars | |||
| 2 | |||
| ``` | |||
| # Méthodes de classes | |||
| De même, techniquement les méthodes qu'on a vu sont des méthodes | |||
| d'instance, et il existe des méthodes de classe | |||
| # Méthodes de classes | |||
| Avec un joli `@classmethod` au-dessus | |||
| ```python | |||
| class Car: | |||
| total_number_of_cars = 0 | |||
| @classmethod | |||
| def print_number_of_cars(cls): | |||
| print(cls.total_number_of_cars, "have been made") | |||
| def print_color(self): | |||
| print("This car is", self.color) | |||
| ``` | |||
| Notez le `cls` | |||
| # Méthodes de classes | |||
| Pour appeler: | |||
| ```python | |||
| >>> ferrari = Car(color="red") | |||
| >>> ford = Car() | |||
| >>> Car.print_number_of_cars() | |||
| 2 cars have been made | |||
| ``` | |||
| # On retrouve le même mécanisme | |||
| * ce qu'on écrit | |||
| ``` | |||
| car.print_color() | |||
| ``` | |||
| \vfill | |||
| * ce qui est appelé: | |||
| ``` | |||
| # self = car | |||
| def print_color(self): | |||
| print(self.color) | |||
| ``` | |||
| # On retrouve le même mécanisme | |||
| * ce qu'on écrit | |||
| ``` | |||
| Car.print_number_of_cars() | |||
| ``` | |||
| \vfill | |||
| * ce qui est appelé: | |||
| ``` | |||
| # cls = Car | |||
| @classmethod | |||
| def print_number_of_cars(cls): | |||
| print(cls.total_number_of_cars) | |||
| ``` | |||
| # | |||
| \center \huge Les API Web | |||
| # Concepts | |||
| # HTTP | |||
| Une façon pour des machines différentes de parler entre elles. | |||
| On fait toujours un aller-retour du *client* vers le *serveur*. | |||
|  | |||
| # Requêtes | |||
| Une requête part du client vers le serveur et consite en: | |||
| * Une URL | |||
| * Un verbe (souvent GET) | |||
| * Des paramètres | |||
| * Et d'autres trucs | |||
| # Réponses | |||
| Une réponse revient du serveur vers le client et contient | |||
| * Un code de retour | |||
| * Du contenu (très souvent, du texte) | |||
| * Et d'autres trucs | |||
| # API Web et navigateurs | |||
| Quand vous tapez une url dans votre navigateur ou que vous suivez | |||
| un lien, c'est votre navigateur qui fait la requête. | |||
| Le serveur lui renvoie un contenu particulier (du HTML) | |||
| C'est ce que vous voyez quand vous faites "show source" | |||
| Vous voyez parfois le code de retour (le plus connu étant 404) | |||
| # API Web et navigateurs | |||
| Grosso modo, quand vous visitez une page, vous faites un GET, | |||
| et quand vous remplissez un formulaire, vous faites un POST | |||
| *C'est très simplifié* | |||
| # Utiliser une API Web | |||
| Grosso modo: | |||
| * Lire les conditions d'utilisation (important!) | |||
| * Regarder les URLs possibles et les paramètres attendus | |||
| * Faire quelque chose avec la réponse | |||
| Notez qu'on a *absolument* aucune connaissance du code qui tourne sur le serveur! | |||
| # JSON | |||
| * Un format *texte*. | |||
| * *Très* utilisé justement pour échanger des données entre des machines différentes. | |||
| * Implémenté dans plein de langages. | |||
| # JSON | |||
| Examples: | |||
| * Une liste: | |||
| ```json | |||
| ["one", "two"] | |||
| ``` | |||
| * Un "objet": | |||
| ```json | |||
| { | |||
| "color": "blue", | |||
| "size": 3 | |||
| } | |||
| ``` | |||
| # JSON | |||
| On peut imbriquer les objets les uns dans les autres: | |||
| ```json | |||
| { | |||
| "a": 42, | |||
| "b": true, | |||
| "c": ["one", "two"], | |||
| } | |||
| ``` | |||
| On dit que JSON est un format *texte* par ce qu'on peut le mettre dans une string. | |||
| # JSON / Python | |||
| Python | JSON | |||
| -------|----- | |||
| dictionnary | object | |||
| True | true | |||
| False | false | |||
| None | null | |||
| # Parser du JSON en Python | |||
| ```python | |||
| >>> import json | |||
| >>> data = json.loads("...") | |||
| >>> data["a"] | |||
| 42 | |||
| ``` | |||
| # Émettre du JSON à partir d'un objet Python | |||
| ```python | |||
| >>> import json | |||
| >>> my_object = { "key1" : ["one", "two"] } | |||
| >>> json.dumps(my_object, indent=2) | |||
| """ | |||
| { | |||
| "key1": ["one", "two"] | |||
| } | |||
| """ | |||
| ``` | |||
| # | |||
| \center \huge Atelier | |||
| # Objectif | |||
| * Partir d'un bout de code (moche) qui utilise l'API marvel | |||
| * Le nettoyer en introduisant des classes | |||
| * Le rendre plus flexible | |||
| * Etc ... | |||