2. Bibliothèque standard🔗

Python dispose d'une très riche bibliothèque de modules étendant les capacités du langage dans de nombreux domaines: nouveaux types de données, interactions avec le système, gestion des fichiers et des processus, protocoles de communication (internet, mail, FTP, etc.), multimédia, etc.

2.1. Gestion des arguments/options de la ligne de commande🔗

Utilisation de sys.argv

Le module sys permet un accès direct aux arguments de la ligne de commande, via la liste sys.argv: sys.argv[0] contient le nom du script executé, sys.argv[1] le nom du 1er argument (s'il existe), etc. P.ex.:

 1# Gestion simplifiée d'un argument entier sur la ligne de commande
 2import sys
 3
 4if sys.argv[1:]:  # Présence d'au moins un argument sur la ligne de commande
 5    try:
 6        n = int(sys.argv[1])  # Essayer de lire le 1er argument comme un entier
 7    except ValueError:
 8        raise ValueError(f"L'argument {sys.argv[1]!r} n'est pas un entier")
 9else:                         # Pas d'argument sur la ligne de commande
10    n = 101                   # Valeur par défaut

Module argparse

Pour une gestion avancée des arguments et/ou options de la ligne de commande, il est préférable d'utiliser le module argparse. P.ex.:

 1    import argparse
 2
 3    parser = argparse.ArgumentParser(
 4        usage="%(prog)s [-p/--plot] [-i/--input coordfile | x1,y1 x2,y2 x3,y3]",
 5        description="Compute the circumscribed circle to 3 points in the plan.",
 6    )
 7    parser.add_argument(
 8        "coords",
 9        nargs="*", type=str, metavar="x,y",
10        help="Coordinates of point"
11    )
12    parser.add_argument(
13        "-i", "--input",
14        nargs="?", type=argparse.FileType("r"),
15        help="Coordinate file (one 'x,y' per line)",
16    )
17    parser.add_argument(
18        "-P", "--plot",
19        action="store_true", default=False,
20        help="Draw the circumscribed circle",
21    )
22    parser.add_argument(
23        "-T", "--tests",
24        action="store_true", default=False,
25        help="Run doc tests"
26    )
27    parser.add_argument("--version", action="version", version=__version__)
28
29    args = parser.parse_args()

Cette solution génère automatiquement une aide en ligne, p.ex.:

$ python3 circonscrit.py -h
usage: circonscrit.py [-p/--plot] [-i/--input coordfile | x1,y1 x2,y2 x3,y3]

Compute the circumscribed circle to 3 points in the plan.

positional arguments:
  x,y                   Coordinates of point

optional arguments:
  -h, --help            show this help message and exit
  -i [INPUT], --input [INPUT]
                        Coordinate file (one 'x,y' per line)
  -p, --plot            Draw the circumscribed circle
  -T, --tests           Run doc tests
  --version             show program's version number and exit

2.2. Pickle: sérialisation des données🔗

Le module pickle permet la sauvegarde pérenne d'objets python (« sérialisation »).

>>> d = dict(a=1, b=2, c=3)
>>> l = ["Calvin", 6, 1.20]
>>> import pickle
>>> pkl = open('archive.pkl', 'wb')        # Overture du fichier en écriture binaire
>>> pickle.dump((d, l), pkl, protocol=-1)  # Sérialisation du tuple (d, l)
>>> pkl.close()                            # *IMPORTANT!* Fermeture du fichier
>>> d2, l2 = pickle.load(open('archive.pkl', 'rb')) # Désérialisation (relecture)
>>> (d == d2) and (l == l2)
True

Attention

les pickles ne sont pas un format d'échange de données. Ils sont spécifiques à python, et peuvent dépendre de la machine utilisée. Ils peuvent en outre constituer une faille de sécurité.

2.3. Batteries included🔗

Quelques modules de la bibliothèque standard qui peuvent être d'intérêt:

  • math: accès aux fonctions mathématiques réelles

    >>> math.asin(math.sqrt(2) / 2) / math.pi * 180
    45.00000000000001
    
  • cmath: accès aux fonctions mathématiques complexes

    >>> cmath.exp(cmath.pi * 1j) + 1
    1.2246467991473532e-16j
    
  • fractions: définition des nombres rationnels

    >>> print(fractions.Fraction(2, 3) + fractions.Fraction(5, 6))
    3/2
    >>> print(fractions.Fraction(*(3.5).as_integer_ratio()))
    7/2
    
  • random: générateurs de nombres aléatoires

    >>> random.sample(range(10), 3)  # Échantillon de 3 éléments sans remplacement
    [9, 1, 6]
    >>> random.gauss(0, 1)           # Distribution normale centrée réduite
    0.1245612752121385
    
  • autres modules numériques et mathématiques;

  • collections définit de nouveaux types spécialisés, p.ex. collections.OrderedDict, un dictionnaire ordonné, ou collections.namedtuple(), pour la création d'objets simples:

    >>> Point = collections.namedtuple("Point", "x y")
    >>> p = Point(3, 4)
    >>> print(p)
    Point(x=3, y=4)
    >>> (p.x**2 + p.y**2)**0.5
    5.0
    
  • functools est une collection d'outils s'appliquant sur des fonctions (mémorisation, fonction partielle, fonction générique, wrapping, etc.)

  • itertools fournit des générateurs de boucle (itérateurs) et de combinatoire:

    >>> [ ''.join(item) for item in itertools.combinations('ABCD', 2) ]
    ['AB', 'AC', 'AD', 'BC', 'BD', 'CD']
    
  • interactions avec le système:

    • sys, os: interface système,

    • shutil: opérations sur les fichiers (copy, move, etc.),

    • subprocess: éxécution de commandes système,

    • glob: métacaractères du shell (p.ex. toto?.*);

  • lecture et sauvegarde des données (outre pickle):

    • csv: lecture/sauvegarde de fichiers CSV,

    • configparser: fichiers de configuration,

    • json: lightweight data interchange format;

2.4. Text/Graphical User Interfaces🔗

Bibliothèques externes: