En surfant paresseusement sur l'espace de noms, j'ai remarqué un objet d'apparence étrange appelé Ellipsis
, il ne semble pas être ou faire quelque chose de spécial, mais c'est un module intégré 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 prendre en charge 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
x=[];x.append(x);print(x)
, pour voir comment il gérait les objets cycliques en chaîne. Il est revenu[[...]]
. Je me suis dit: "Je me demande ce qui se passe si je tape[[...]]
? Je suppose que cela déclencherait une erreur de syntaxe. Au lieu de cela, il est revenu[[Ellipsis]]
. Python est tellement bizarre. La recherche Google qui a suivi m'a amené à cette page....
dans une repr récursive est juste un espace réservé et n'a aucun rapport avecEllipsis
Réponses:
Cela a été soulevé récemment dans une autre question . Je développerai ma réponse à partir de là:
Les points de suspension sont un objet qui peut apparaître en notation de tranche. Par exemple:
Son interprétation dépend uniquement de ce qui implémente la
__getitem__
fonction et y voit desEllipsis
objets, mais son utilisation principale (et prévue) se trouve dans la bibliothèque tierce numpy , 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 également utile de pouvoir découper en plusieurs dimensions. Par exemple, étant donné un tableau 4x4, la zone en haut à gauche serait définie par la tranche[:2,:2]
:Pour étendre cela, Ellipsis est utilisé ici pour indiquer un espace réservé pour le reste des dimensions du tableau non spécifié. Considérez-le comme indiquant la tranche complète
[:]
pour toutes les dimensions de l'espace dans lequel il est placé, donc pour un tableau 3D,a[...,0]
est le même quea[:,:,0]
pour 4da[:,:,:,0]
, de même,a[0,...,0]
esta[0,:,:,0]
(avec autant de deux-points au milieu constituent le nombre complet des dimensions dans le tableau).Fait intéressant, en python3, le Ellipsis literal (
...
) est utilisable en dehors de la syntaxe de tranche, vous pouvez donc réellement écrire:À part les différents types numériques, non, je ne pense pas que ce soit utilisé. Pour autant que je sache, il a été ajouté uniquement pour une utilisation numpy et n'a aucun support de base autre que la fourniture de l'objet et de la syntaxe correspondante. L'objet étant là ne l'exigeait pas, mais le support littéral "..." pour les tranches le faisait.
la source
typing
module de bibliothèque standard : par exempleCallable[..., int]
pour indiquer un appelable qui retourne unint
sans spécifier la signature, ouTuple[str, ...]
pour indiquer un tuple de chaînes homogène de longueur variable.a = [1, 2]; a[0] = a; print(a)
donne[[...], 2]
. Est-ce la même chose ou une utilisation différente?Dans Python 3, vous pouvez utiliser le littéral Ellipsis
...
comme espace réservé "nop" pour le code:Ce n'est pas magique; n'importe quelle expression peut être utilisée à la place de
...
, par exemple:(Je ne peux pas utiliser le mot «sanctionné», mais je peux dire que cette utilisation n'a pas été catégoriquement rejetée par Guido.)
la source
...
utilisé où les gens veulent indiquer quelque chose qu'ils ont l'intention de remplir plus tard (un bloc vide 'todo') etpass
signifier un bloc destiné à ne pas avoir de code.NotImplemented
littéral, qui est utile lorsque vous voulez que votre fonction incomplète renvoie quelque chose de significatif (au lieu deNone
comme dans votre exemple). (Autre cas d'utilisation: implémentation d'opérations arithmétiques )NotImplemented = 'something_else'
c'est du python valide, mais... = 'something_else'
c'est une erreur de syntaxe.NotImplemented
n'est pas destiné à être une alternative àNone
. Son utilisation est assez étroite. Voir la documentation iciDepuis Python 3.5 et PEP484 , les points de suspension littéraux sont utilisés pour désigner certains types à un vérificateur de type statique lors de l'utilisation du module de saisie .
Exemple 1:
Exemple 2:
la source
Vous pouvez également utiliser les points de suspension pour spécifier le doctorat attendu sortie :
la source
...
soient syntaxiques, et nonuse
l'objet Ellipsis réel. N'est-ce vraiment rien de plus qu'un nom pratique pour un concept adaptable?Dans la documentation Python :
la source
Résumant ce que d'autres ont dit, à partir de Python 3, Ellipsis est essentiellement une autre constante singleton similaire
None
, mais sans utilisation particulière. Les utilisations existantes comprennent:Callable[..., int]
ouTuple[str, ...]
)Les utilisations possibles pourraient inclure:
None
est une option validela source
__getitem__
...
exemple minimal dans une classe personnaliséeLorsque la syntaxe magique
...
est transmise à[]
une classe personnalisée,__getitem__()
reçoit unEllipsis
objet de classe.La classe peut alors faire ce qu'elle veut avec cet objet Singleton.
Exemple:
Le Python intégré
list
classe choisit de lui donner la sémantique d'une plage, et toute utilisation sensée devrait également bien sûr.Personnellement, je m'en tenir à l'écart dans mes API et créer à la place une méthode distincte et plus explicite.
Testé en Python 3.5.2 et 2.7.12.
la source
Vous pouvez utiliser Ellipsis vous-même, dans des situations de découpage personnalisé comme l'a fait numpy, mais il n'a aucune utilisation dans aucune classe intégrée.
Je ne sais pas s'il a été ajouté spécifiquement pour être utilisé dans numpy, mais je ne l'ai certainement pas vu utilisé ailleurs.
Voir aussi: Comment utilisez-vous la syntaxe de découpage des points de suspension en Python?
la source
Comme mentionné par @ noɥʇʎԀʎzɐɹƆ et @phoenix - Vous pouvez en effet l'utiliser dans des fichiers stub. par exemple
Plus d'informations et d'exemples sur la façon d'utiliser ces points de suspension peuvent être découverts ici https://www.python.org/dev/peps/pep-0484/#stub-files
la source
Son utilisation prévue ne devrait pas être réservée à ces modules tiers. Il n'est pas mentionné correctement dans la documentation Python (ou peut-être que je ne le trouve pas), mais les points de suspension
...
sont en fait utilisés dans CPython à au moins un endroit.Il est utilisé pour représenter des structures de données infinies en Python. Je suis tombé sur cette notation en jouant avec des listes.
Voir cette question pour plus d'informations.
la source
ellipsis
intégré et l'Ellipsis
objet. La représentation de structures de données infinies avec des ellipses est purement pour l'affichage, n'ayant rien à voir avec leellipsis
type ou l'Ellipsis
objet.__repr__
chaînes Python visent à être des expressions Python valides - sans les ellipses existant dans le langage comme il le fait, la représentation ne serait pas une expression valide.eval(repr(a))
à être égal àa
. Malheureusement, c'est faux de temps en temps dans la pratique, même pour les types intégrés. Essayez ceci:a=[]; a.append(a); eval(repr(a))
.repr(a)
est[[...]]
une expression non valide dans Python 2. (Dans Python 3, c'est valide, mais le résultat de l'évaluation est quelque chose de différent, toujours contraire à l'intention d'origine.)C'est équivalent.
...
est une constante définie à l'intérieurbuilt-in constants
.la source