Updated first chapter slides. Added new questions in the new training section.
176 lines
7.0 KiB
Markdown
176 lines
7.0 KiB
Markdown
---
|
||
title: Réutiliser du code
|
||
author: Steve Kossouho
|
||
---
|
||
|
||
# Réutiliser du code
|
||
|
||
----
|
||
|
||
En Python, on peut écrire des choses simples qui tiennent dans un seul fichier de script.
|
||
Souvent, les projets plus ambitieux écrivent du code organisé de façon un peu plus complexe,
|
||
ou encore du code qui réemploie des fonctionnalités décrites dans des scripts externes.
|
||
|
||
----
|
||
|
||
## Jargon : [Modules]{.naming} et [packages]{.naming}
|
||
|
||
Jusque là, tout ce que nous avons écrit, c'est des [modules]{.naming}. Ce sont des fichiers .py (vides ou non, ils peuvent contenir du code).
|
||
|
||
Il existe aussi les [packages]{.naming}. Ce sont des répertoires, pouvant contenir d'autres modules, et qui sont utilisables comme des modules (peuvent contenir du code).
|
||
Pour pouvoir associer du code à ces répertoires et les considérer comme des packages, la spécification du langage Python impose que le code associé repose dans un
|
||
fichier nommé `__init__.py` dans le répertoire. L'intérêt principal d'un package est d'y ranger d'autres packages et modules, pour organiser son code en arborescence cohérente.
|
||
|
||
----
|
||
|
||
## Typographie des modules et packages
|
||
|
||
Les modules et packages ont la même typographie que les variables (car Python les traite comme des variables de type `module`) :
|
||
|
||
- Tout en minuscules (ex. `my_package`)
|
||
- Sans espace ni tiret (ex. `super_package`). Un module contenant un espace n'est pas réutilisable.
|
||
- Aucun caractère accentué (ex. `derogations_generiques`)
|
||
- Peut contenir des chiffres, mais doit commencer par une lettre.
|
||
|
||
|
||
----
|
||
|
||
## Bibliothèque standard de Python
|
||
|
||
Python est à la fois un langage et un exécutable interprétant des scripts écrits dans le langage.
|
||
L'interpréteur est toujours livré avec ce qu'on appelle la bibliothèque standard.
|
||
Il s'agit d'une immense bibliothèque de fonctionnalités, que l'on peut réutiliser dans nos programmes.
|
||
|
||
La bibliothèque propose des outils pour manipuler du texte, du réseau, des bases de données, des fonctions mathématiques, etc.
|
||
|
||
[Liste des modules et packages de la bibliothèque standard](https://docs.python.org/3/library/)
|
||
|
||
----
|
||
|
||
### Modules utiles
|
||
|
||
Parmi les très nombreux modules (environ `220`) de la bibliothèque standard, assez peu vous serviront régulièrement.
|
||
En voici une liste :
|
||
|
||
- `random` : génération de nombres aléatoires
|
||
- `math` : fonctions arithmétiques, logarithmiques et trigonométriques
|
||
- `statistics` : fonctions statistiques de base, comme l'écart type.
|
||
- `pathlib` : outils pour gérer les chemins de fichier
|
||
- `datetime` : types pour gérer les dates
|
||
- `re` : pour gérer des expressions régulières (compatibles _Perl_)
|
||
|
||
D'autres peuvent servir ponctuellement, comme `csv` ou `sqlite3` pour nos exemples à venir.
|
||
|
||
----
|
||
|
||
### Importer des fonctionnalités
|
||
|
||
Par défaut, seules les fonctionnalités documentées dans les sections natives (`builtins`) sont directement utilisables,
|
||
et pour pouvoir utiliser les autres fonctionnalités, il faut en faire la demande explicite dans votre code via la notion d'`import` :
|
||
|
||
```python {.numberLines}
|
||
import math # importe le module math via une variable
|
||
from os import path # importe le module path du package os
|
||
from os.path import basename # importe directement basename depuis os.path
|
||
from math import sin, cos # importer plusieurs fonctions depuis math
|
||
import datetime as dt # datetime est utilisable en tant que dt uniquement
|
||
|
||
print(math.cos(math.pi / 2.0)) # utilise uniquement l'import de math
|
||
print(cos(math.pi / 2.0), sin(math.pi / 2.0)) # utilise l'import de sin et cos
|
||
print(path.basename("/chemin/de/fichier/linux.txt")) # utilise l'import de path
|
||
print(basename("/chemin/de/fichier/linux.txt")) # utilise l'import de basename
|
||
print(dt.date.today())
|
||
```
|
||
|
||
Chaque script qui référence directement un objet provenant d'une bibliothèque doit toujours l'importer.
|
||
|
||
**Note** : Pour importer le contenu d'un module ou un élément d'un module, l'interpréteur Python doit toujours
|
||
exécuter le contenu dudit module, afin d'en connaître le contenu.
|
||
|
||
----
|
||
|
||
## Un peu de calcul avec la bibliothèque standard
|
||
|
||
Avec l'outil que sont les imports, on peut avoir accès à de nombreuses fonctions de calcul.
|
||
Par exemple, on pourrait générer un nombre aléatoire et calculer un cosinus :
|
||
|
||
```python {.numberLines}
|
||
import random
|
||
import math
|
||
|
||
number = random.randint(0, 100) # nombre entre 0 et 100 inclus
|
||
cosinus_result = math.cos(number) # cosinus du nombre aléatoire
|
||
|
||
while True:
|
||
try:
|
||
guess = int(input("Saisissez un nombre entre 0 et 100 : "))
|
||
# Les lignes suivantes s'exécuteront si la ligne du dessus ne génère pas d'erreur
|
||
if guess < number:
|
||
print("C'est supérieur.")
|
||
elif guess > number:
|
||
print("C'est inférieur.")
|
||
else:
|
||
print("C'est gagné !")
|
||
break # Quitter la boucle
|
||
except ValueError: # si impossible de récupérer l'équivalent entier
|
||
print("Saisie incorrecte.")
|
||
```
|
||
|
||
- [Documentation du module `random`](https://docs.python.org/3/library/random.html)
|
||
- [Documentation du module `math`](https://docs.python.org/3/library/math.html)
|
||
|
||
----
|
||
|
||
## Extra : Installer des paquets externes ([PyPI](https://pypi.org))
|
||
|
||
Avec PyCharm, on peut installer simplement quelques paquets externes et utiliser leurs fonctionnalités :
|
||
|
||
1. `requests` : Faire des requêtes HTTP et consommer des API REST
|
||
2. `unidecode` : Translittération et désaccentuation
|
||
3. `faker` : Anonymiser avec des données factices (noms, adresses, téléphone, code pin, etc.)
|
||
|
||
----
|
||
|
||
### Gérer un environnement virtuel pour installer des bibliothèques
|
||
|
||
Python est livré avec un outil en ligne de commande nommé `pip`, qui vous permet facilement de télécharger et
|
||
installer des bibliothèques externes publiées sur le site [PyPI](https://pypi.org).
|
||
|
||
Si pour votre projet, vous avez besoin de la dernière version de la bibliothèque `requests`, par exemple, vous pouvez l'installer
|
||
avec la commande suivante dans un terminal :
|
||
|
||
```sh {.numberLines}
|
||
pip install requests
|
||
```
|
||
|
||
La dernière version de la bibliothèque compatible avec votre version de Python sera installée dans un répertoire spécifique
|
||
avec le nom `requests`. Vous ne pouvez pas installer plusieurs versions simultanées de la même bibliothèque au même endroit.
|
||
|
||
----
|
||
|
||
### Les environnements virtuels pour gérer ses versions de paquets
|
||
|
||
Un environnement virtuel (`venv`) se présente sous la forme d'un répertoire avec quelques scripts, dont `python`. Lorsqu'un environnement
|
||
virtuel est "activé" via l'un de ses scripts, il se passe plusieurs choses :
|
||
|
||
- Les bibliothèques installées avec `pip` sont installées dans cet environnement virtuel
|
||
- L'exécutable `python` de l'environnement peut importer les bibliothèques installées dans ce dernier
|
||
|
||
L'intérêt est de pouvoir facilement gérer plusieurs projets qui nécessitent des versions différentes des mêmes
|
||
bibliothèques.
|
||
|
||
Les environnements virtuels peuvent être créés, sélectionnés, et utilisés automatiquement avec Visual Studio Code
|
||
et PyCharm.
|
||
|
||
----
|
||
|
||
#### PyCharm
|
||
|
||
TODO
|
||
|
||
----
|
||
|
||
#### Visual Studio Code
|
||
|
||
TODO
|