Python : l’objet Ellipsis ou Points de Suspension

Python est un langage formidable pour lequel on découvre tous les jours un truc. Et ce week-end, je viens de découvrir que les points de suspension sont un objet en Python, l’objet Ellipsis.

À quoi ça sert ? Habituellement, avec Python, vous pouvez consulter la doc mais il s’avère qu’elle est assez pauvre (ce n’est pas peu dire…). Cela méritait donc un petit article.

L’objet Ellipsis

La traduction d’ellipsis en français est bien ellipse. Et une ellipse, en typographie, représente par extension du sens premier, les points de suspension.

Vous avez deux manières de créer un objet Ellipsis : par son écriture littérale, trois points représentant, des points de suspension ou par le nom de l’objet en lui même.

>>> ...
Ellipsis
>>> Ellipsis
Ellipsis

Communément, c’est l’écriture littérale qui est la plus courante. Faites bien attention, le caractère points de suspension, …, existe aujourd’hui et est accessible sur beaucoup de claviers. Mais ici, c’est bien trois points qu’il faut utiliser.

Mais pour quoi faire ?

Pour des blocs à écrire

Vous connaissez certainement l’instruction pass. Elle est définie comme étant une instruction qui ne fait rien, utilisée là où un code est attendu mais que vous n’en n’avez pas.

Un usage, que j’ai longtemps conseillé, est dans les blocs des fonctions, méthodes ou même classes que vous déclarez mais que vous n’avez pas encore écrit. Cela permet de déclarer la structure et de ne pas avoir d’erreurs d’interprétation.

def ma_fonction():
    pass

ma_fonction()

Et bien à la place, vous pouvez utiliser l’objet Ellipsis.

def ma_fonction():
    ...

ma_fonction()

Quand utiliser l’instruction pass et quand utiliser l’objet Ellipsis ? À mon sens, les points de suspension sont plus élégants pour représenter un vide à compléter. Ainsi, j’utiliserai ceux-ci pour les blocs vide qu’il me faut remplir. L’instruction pass est plus parlante pour un bloc qui doit être vide, indiquant que ce bloc doit rester vide.

Pour le slicing avec NumPy

Le slicing est un outils très pratique pour couper des tranches d’une séquence. NumPy, c’est la bibliothèque qui permet de travailler efficacement avec des matrices. Elle est la base de nombreux projets d’analyse de données comme matplotlib ou Pandas.

NumPy permet de travailler sur des matrices, des tableaux, à plusieurs dimensions. Et pour ces tableaux, on peut faire des slices. Mais ça se complique. Commençons avec un tableau à deux dimensions :

>>> import numpy as np
>>> my_array = np.array([[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26]])
>>> my_array
array([[11, 12, 13, 14, 15, 16],
       [21, 22, 23, 24, 25, 26]])

La syntaxe du slicing avec NumPy peut être un peu déroutante car NumPy adapte la syntaxe pour extraire les données sur plusieurs dimensions. Ainsi, si je souhaite récupérer les 3 premières colonnes pour toutes les lignes, la syntaxe devra être la suivante :

>>> my_array[:, :3]
array([[11, 12, 13],
       [21, 22, 23]])

Vous voyez que le slice a deux parties : la première, du début à la fin, concerne le premier niveau, c’est à dire toutes les listes. La seconde concerne chaque liste retenue du second niveau, ce qui revient à nos colonnes.

Ajoutons maintenant une troisième dimension…

>>> my_array = np.array([[[111, 112, 113, 114, 115, 116],
...                       [121, 122, 123, 124, 125, 126]],
...                      [[211, 212, 213, 214, 215, 216],
...                       [221, 222, 223, 224, 225, 226]]])
>>> my_array
array([[[111, 112, 113, 114, 115, 116],
        [121, 122, 123, 124, 125, 126]],

       [[211, 212, 213, 214, 215, 216],
        [221, 222, 223, 224, 225, 226]]])

Pour extraire les trois premières colonnes des deux dimensions, il faudra prendre l’ensemble des tableaux et sous-tableaux. Ceci nous conduit à l’expression suivante :

>>> my_array[:, :, :3]
array([[[111, 112, 113],
        [121, 122, 123]],

       [[211, 212, 213],
        [221, 222, 223]]])

Ce qui en fait se simplifie avec l’ellipse :

>>> my_array[..., :3]
array([[[111, 112, 113],
        [121, 122, 123]],

       [[211, 212, 213],
        [221, 222, 223]]])

Bon… On a autant de caractères mais… ça se lit plus vite…

Pour les Type Hints

Les Type Hint sont apparus en Python 3.6 avec la PEP-526. Ils permettent d’informer sur les types attendus.

L’objet Ellipsis a plusieurs usages documentés dans la documentation du module Typing. On va ainsi les retrouver pour les Callables et les N-Uplets (Tuple).

Lorsque votre paramètre attendu est un Callable, la syntaxe du type hint doit déclarer deux paramètres : une liste correspondant aux types des paramètres et un type pour le retour. Ainsi, Callable([int], str) attends un paramètre de type entier et retourne une chaine de caractères. L’Ellipsis peut être utilisé ici pour indiquer que le Callable prends un nombre indéterminé de paramètres. La syntaxe est alors Callable([...], ReturnType).

Pour les N-uplets, l’Ellipsis permet d’informer que le type de données attendu est uniforme. Un type hint Tuple[int, ...] signifie qu’il est attendu un n-uplet d’entiers.

En conclusion

Voilà une fonctionnalité que vous rencontrerez… Disons le, rarement. Mais qu’il est toujours bon de connaitre. En ce qui me concerne, je vais adopter son usage pour différentier les blocs vide pour lesquels le code reste à écrire des blocs destinés à être vide. Et vous ?

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.

Vous aimerez aussi...

3 réponses

  1. jolindien dit :

    Pour numpy, « … » est très pratique quand la dimension du tableau (= tenseur) est variable.
    Par exemple, commençons avec
    my_array = np.array([[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26]])
    alors
    my_array[:, :, :3]
    plante car my_array est de dimension 2, alors que
    my_array[…, :3]
    fonctionne avec my_array de dimension 2 ou 3 (ou plus).

  2. jolindien dit :

    interessant !

  1. 2 juin 2022

    […] En passant, ce code est bien valide, pour ceux qui auraient raté mon post, il utilise l’objet Ellipsis. […]

Laisser un commentaire

En naviguant sur Dad 3.0, vous acceptez l’utilisation de cookies pour une navigation optimale et nous permettre de réaliser des statistiques de visites. Plus d'informations

Le blog Dad 3.0 utilise les cookies pour vous permettre une navigation optimale et nous permettre de réaliser des statistiques de visite. Dad 3.0 affichant des publicités, celles-si utilisent également des cookies pour un ciblage publicitaire. En continuant la navigation sur Dad 3.0, vous acceptez le dépôt et la lecture de cookies.

Fermer