798 votes

Que fait l'objet Ellipsis ?

En surfant oisivement sur l'espace de noms, j'ai remarqué un objet étrange appelé Ellipsis Il ne semble pas être ou faire quelque chose de spécial, mais il s'agit d'un buildin disponible dans le monde entier.

Après une recherche, j'ai trouvé qu'il est utilisé dans une variante obscure de la syntaxe de découpage par Numpy et Scipy... mais presque rien d'autre.

Cet objet a-t-il été ajouté au langage spécifiquement pour supporter Numpy + Scipy ? Ellipsis a-t-il une signification ou une utilisation générique ?

D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis

1 votes

Voir les réponses à stackoverflow.com/questions/752602/

46 votes

Je l'ai trouvé comme ça : J'ai entré x=[];x.append(x);print(x) pour voir comment il gère la stringification des objets cycliques. Il a retourné [[...]] . J'ai pensé "Je me demande ce qui se passe si je tape dans [[...]] ? Je pensais qu'une erreur de syntaxe se produirait. Au lieu de cela, il renvoie [[Ellipsis]] . Python est tellement bizarre. La recherche Google qui s'en est suivie m'a conduit à cette page.

46 votes

Notez que le ... dans une récursive repr est juste un espace réservé et n'a aucune relation avec Ellipsis

792voto

Brian Points 48423

Cette question a été soulevée dans une autre question récemment. Je vais développer mon réponse à partir de là :

Ellipses est un objet qui peut apparaître dans la notation des tranches. Par exemple :

myList[1:2, ..., 0]

Son interprétation est purement laissée à la personne qui met en œuvre le système de gestion de l'information. __getitem__ et voit Ellipsis mais son utilisation principale (et prévue) se fait dans le cadre de l'initiative de l'Union européenne. numpy bibliothèque tierce, qui ajoute un type de tableau multidimensionnel. Puisqu'il y a plus d'une dimension, le découpage devient plus complexe qu'un simple index de début et de fin ; il est utile de pouvoir également découper en plusieurs dimensions. Par exemple, dans un tableau 4 × 4, la zone supérieure gauche serait définie par la tranche suivante [:2, :2] :

>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

>>> a[:2, :2]  # top left
array([[1, 2],
       [5, 6]])

Pour aller plus loin, Ellipsis est utilisé ici pour indiquer un espace réservé pour le reste des dimensions du tableau non spécifiées. Pensez-y comme indiquant la tranche complète [:] pour toutes les dimensions dans l'espace où il est placé, donc pour un tableau 3d, a[..., 0] est la même chose que a[:, :, 0] et pour 4d a[:, :, :, 0] de la même manière, a[0, ..., 0] es a[0, :, :, 0] (avec le nombre de deux-points au milieu qui correspond au nombre total de dimensions du tableau).

Il est intéressant de noter que, dans python3, le littéral Ellipsis ( ... ) est utilisable en dehors de la syntaxe de la tranche, de sorte que vous pouvez réellement écrire :

>>> ...
Ellipsis

EDIT : Ellipsis est également utilisé dans la bibliothèque standard. typing module : par exemple Callable[..., int] pour indiquer un appelant qui renvoie un int sans spécifier la signature, ou tuple[str, ...] pour indiquer un tuple homogène de chaînes de caractères de longueur variable.

41 votes

Il est également utilisé dans les indications de type PEP484 dans les fichiers stub.

93 votes

Juste au cas où quelqu'un serait curieux : il est également utilisé dans la bibliothèque standard typing module : par exemple Callable[..., int] pour indiquer un appelant qui renvoie un int sans spécifier la signature, ou Tuple[str, ...] pour indiquer un tuple homogène de chaînes de caractères de longueur variable.

26 votes

Pour info, le framework FastAPI (qui est pour python 3.6+) l'utilise aussi (maintenant). fastapi.tiangolo.com/tutorial/query-params-str-validations

353voto

tzot Points 32224

En Python 3, vous puede ¹ utiliser l'Ellipsis littéral ... comme un "nop" pour le code qui n'a pas encore été écrit :

def will_do_something():
    ...

C'est pas magique ; toute expression peut être utilisée à la place de ... par exemple :

def will_do_something():
    1

(Je ne peux pas utiliser le mot "sanctionné", mais je peux dire que cette utilisation était non rejetés catégoriquement par Guido.)

¹ 'can' not in {'must', 'should'}

259 votes

Dans une demi-convention, je vois souvent ... utilisé lorsque les gens veulent indiquer quelque chose qu'ils ont l'intention de remplir plus tard (un bloc vide "à faire") et pass pour désigner un bloc destiné à n'avoir aucun code.

40 votes

Python dispose également de la fonction NotImplemented ce qui est utile lorsque vous souhaitez que votre fonction incomplète renvoie quelque chose de significatif (au lieu de None comme dans votre exemple). (Autre cas d'utilisation : Mise en œuvre des opérations arithmétiques )

25 votes

@zvyn Ce n'est pas un littéral. C'est juste un nom. Par exemple NotImplemented = 'something_else' est un python valide, mais ... = 'something_else' est une erreur de syntaxe.

48voto

Chiggs Points 1246

Vous pouvez également utiliser l'Ellipsis lorsque vous spécifiez les résultats attendus. doctest sortie :

class MyClass(object):
    """Example of a doctest Ellipsis

    >>> thing = MyClass()
    >>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'>
    >>> type(thing)           # doctest:+ELLIPSIS
    <class '....MyClass'>
    """
    pass

16 votes

Mais est-ce que cela implique réellement l'objet Ellipsis ? Ne s'agit-il pas simplement d'une fonctionnalité du parser/matcher de doctest ?

3 votes

@akaihola Je dirais qu'il le fait, comme décrit à doctest.ELLIPSIS . Je m'attends à ce que la plupart, sinon toutes les utilisations de ... sont syntaxiques, et ne sont pas use l'objet Ellipsis réel. N'est-ce pas en fait rien de plus qu'un nom pratique pour un concept adaptable ?

0 votes

Cela fait référence à une ellipse dans le texte, pas au littéral Python. ... .

38voto

Simon Lieschke Points 7351

De la Documentation Python :

Cet objet est couramment utilisé pour le découpage en tranches (voir Tranches ). Il ne supporte aucune opérations spéciales. Il existe exactement un objet ellipsis, nommé Ellipsis (un nom intégré). type(Ellipsis)() produit l'ellipse singleton.

Il s'écrit comme suit Ellipsis o ... .

14voto

sykora Points 30290

Vous pouvez utiliser Ellipsis vous-même, dans des situations de découpage personnalisé comme l'a fait numpy, mais il n'est pas utilisé dans une classe intégrée.

Je ne sais pas si elle a été ajoutée spécifiquement pour être utilisée dans numpy, mais je ne l'ai certainement pas vue utilisée ailleurs.

Voir aussi : Comment utiliser la syntaxe de découpage en ellipses en Python ?

0 votes

Il est également utilisé par PyTorch et d'autres bibliothèques maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X