Sam & Max » ellipsis http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 A quoi sert Ellipsis en Python ? 5 http://sametmax.com/a-quoi-sert-ellipsis-en-python/ http://sametmax.com/a-quoi-sert-ellipsis-en-python/#comments Wed, 12 Feb 2014 14:56:57 +0000 http://sametmax.com/?p=7658 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
[[...]]
]]>
http://sametmax.com/a-quoi-sert-ellipsis-en-python/feed/ 5