A quoi sert Ellipsis en Python ? 5


A rien.

Nan mais revenez, je déconnais.

Mais, sérieusement, Ellipsis, à la base, ne sert à rien.

Il existe, c’est tout.

En Python 2:

>>> Ellipsis
Ellipsis
>>> ... # pas de forme abrégée 
  File "<stdin>", line 1
    ...
    ^
SyntaxError: invalid syntax
>>> range(10)[...] # mais ceci n'est pas une syntaxe error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: range indices must be integers or slices, not ellipsis
>>> str(Ellipsis)
'Ellipsis'
>>> Ellipsis() # ce truc ne sert à rien
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'ellipsis' object is not callable
>>> Ellipsis + Ellipsis # a rien je vous dis
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'ellipsis' and 'ellipsis'
>>> Ellipsis is Ellipsis # c'est un singleton
True
>>> bool(Ellipsis) # c'est comme None, mais en True
True

En Python 3:

>>> ...
Ellipsis

Comme je vous le disais, ça ne sert à rien.

Du coup on peut en faire ce qu’on veut ! It’s toasted !

Les libs comme NumPy s’en servent pour faire du slicing étendu. Elles ré-implementent __getitem__ et quand elles voient Ellipsis, elles interprètent ça comme un “:pour toutes les dimensions non spécifiées.

Il y a des gens qui l’utilisent en lieu et place de pass pour dire “j’écrirai ce truc plus tard”:

def fonction_optionelle():
    ...

Bien entendu, ça ne marche qu’en Python 3.

Personnellement je m’en sers comme valeur quand j’ai besoin d’un truc neutre qui ne soit pas None si None peut être une valeur attendue. Au final quand on veut faire propre, il vaut mieux faire un objet dédié qui s’appelle NotAValue ou autre, mais le quick and dirty a la vie dure.

Attention, les références récursives sont signalées par le shell Python comme ..., mais ça n’a rien à avoir avec la choucroute :

>>> l = []
>>> l.append(l)
>>> l
[[...]]

5 thoughts on “A quoi sert Ellipsis en Python ?

  • Zanguu

    Le premier lien est cassé.

    “mais ça n’a rien à avoir avec la choucroute :” => “mais ça n’a rien à voir avec la choucroute :”, un ‘a’ de trop.

    Et la traduction française appelle le mec sur la photo un “testi-gueule”. Le meilleur moyen de perdre un combat => donner sa faiblesse dans le nom (et pour le curieux, il n’en a effectivement pas en bas).
    Donc à part augmenter le nombre d’adversaires dans le fight pour rendre le vainqueur encore plus méritant, effectivement il ne sert à rien.

    Et merci pour le post pendant ma dernière pause café du jour =D

  • jpcw

    ellipsis est très utile dans les doctests.
    au hasard : sur un raise, un traceback etc

    Bref promis il y a des gens qui s’en servent exemple bien expliqué ici PyMOTW

  • kontre

    @desfrenes: pass est une instruction qui dit de ne rien faire. Ellipsis est un objet. Tu pourrais mettre 42 dans le corps de la fonctions ça ferait pareil, c’est une expression qui ne fait rien (sauf sauf un shell ou ça affiche l’expression en question). Il n’y a que dans le cas de la fonction que le résultat est équivalent.

    @jpcw: dans les doctests ce n’est pas l’objet Ellipsis qui est utilisé, mais la notation ellipsis, mot anglais voulant dire “trois petits points”. Évidemment ça s’écrit pareil, mais pour le programme ce n’est pas la même chose !

    Et c’est vrai que c’est pratique pour numpy, par contre je suppose qu’en abuser doit faire perdre pas mal en lisibilité. Perso je ne l’ai utilisé que si l’Ellipsis est au début ou à la fin du getitem.

  • jpcw

    @kontre exact, j’ai dit une bêtise sur ce coup là ! je viens de regarder dans le code de doctests tu as parfaitement raison, ce n’est pas l’objet Ellipsis lui même qui est utilisé.

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.