En surfant inutilement sur l'espace de noms, j'ai remarqué un objet étrange appelé "Ellipsis", il ne semble pas être ou ne rien faire de spécial, mais c'est une fonction intégrée disponible dans le monde entier.
Après une recherche, j'ai trouvé qu'il était 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 générique ou une utilisation?
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
Cela est apparu dans un autre question récemment. Je vais élaborer sur mon réponse à partir de là:
Ellipsis est un objet pouvant apparaître en notation par tranches. Par exemple:
myList[1:2, ..., 0]
Son interprétation est purement jusqu’à ce qui implémente la fonction __getitem__
et y voit les objets Ellipsis
, mais son utilisation principale (et prévue) se trouve dans l’extension python numérique , qui ajoute un type de tableau multidimensionnel. Puisqu'il existe plusieurs dimensions, le découpage en tranches 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, dans un tableau 4x4, la zone en haut à gauche serait définie par la tranche [: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. Considérez-le comme indiquant la tranche complète [:]
pour toutes les dimensions de son espace. Ainsi, pour un tableau 3D, a[...,0]
est identique à a[:,:,0]
et pour 4d, a[:,:,:,0]
, de même, a[0,...,0]
est a[0,:,:,0]
(avec le nombre de points au milieu, le nombre total de dimensions du tableau).
Fait intéressant, en python3, le littéral Ellipsis (...
) est utilisable en dehors de la syntaxe de la tranche, vous pouvez donc écrire:
>>> ...
Ellipsis
Outre les différents types numériques, non, je ne pense pas que cela soit utilisé. Autant que je sache, il a été ajouté uniquement pour une utilisation numpy et ne prend en charge que la fourniture de l'objet et de la syntaxe correspondante. L'objet étant là n'exigeait pas cela, mais le support littéral "..." des tranches le faisait.
Dans Python 3, vous pouvez utiliser le littéral Ellipsis ...
comme espace réservé "nop" pour le code:
def will_do_something():
...
Ceci 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 ) n'a pas été carrément rejetée par Guido.
À partir de Python 3.5 et PEP484 , l'Ellipsis littéral est utilisé pour désigner certains types dans un vérificateur de type statique lors de l'utilisation du module typage .
Exemple 1:
Des n-uplets homogènes de longueur arbitraire peuvent être exprimés en utilisant un type et des ellipses, par exemple
Tuple[int, ...]
Exemple 2:
Il est possible de déclarer le type de retour d'un appelable sans spécifier la signature de l'appel en substituant un Ellipsis littéral (trois points) à la liste des arguments:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
Vous pouvez également utiliser les points de suspension pour spécifier le résultat attendu doctest :
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
De la documentation Python :
Cet objet est utilisé en notation de tranche étendue (voir le Manuel de référence de Python). Il ne supporte aucune opération spéciale. Il existe exactement un objet Ellipsis, nommé
Ellipsis
(un nom intégré).
En résumé, à partir de Python 3, Ellipsis est essentiellement une autre constante singleton similaire à None
, mais sans utilisation particulière. Les utilisations existantes comprennent:
Callable[..., int]
ou Tuple[str, ...]
)Les utilisations possibles pourraient inclure:
None
est une option valideVous pouvez utiliser Ellipsis vous-même, dans des situations de découpage personnalisées comme numpy, mais il n’est utilisé 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 de Ellipsis en Python?
__getitem__
minimal ...
exemple dans une classe personnalisée
Lorsque la syntaxe magique ...
est transmise à []
dans une classe personnalisée, __getitem__()
reçoit un objet de classe Ellipsis
.
La classe peut alors faire ce qu’elle veut avec cet objet Singleton.
Exemple:
class C(object):
def __getitem__(self, k):
return k
# Single argument is passed directly.
assert C()[0] == 0
# Multiple indices generate a Tuple.
assert C()[0, 1] == (0, 1)
# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)
# Ellipsis notation generates the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with `is`.
assert C()[...] is Ellipsis
# Everything mixed up.
assert C()[1, 2:3:4, ..., 6] == (1, slice(2,3,4), Ellipsis, 6)
La classe Python intégrée list
choisit de lui attribuer la sémantique d'une plage, et toute utilisation sensée de celle-ci devrait bien entendu l'être aussi.
Personnellement, je ne ferais que m'en éloigner dans mes API et créerais une méthode distincte, plus explicite.
Testé en Python 3.5.2 et 2.7.12.
Comme mentionné par @ noɥʇʎԀʎzɐɹƆ et @phoenix - vous pouvez en effet l'utiliser dans des fichiers de raccord. par exemple.
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
Plus d’informations et d’exemples sur la façon d’utiliser ces Ellipsis peuvent être découverts ici https://www.python.org/dev/peps/pep-0484/#stub-files
Son utilisation prévue ne devrait pas être uniquement pour ces modules tiers. Il n'est pas mentionné correctement dans la documentation Python (ou peut-être que je ne pouvais pas le trouver) mais l'ellipsis ...
est en fait utilisé dans CPython dans 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 les listes.
Voir cette question pour plus d'informations.
Ceci est équivalent.
_l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]
_
_...
_ est une constante définie à l'intérieur de built-in constants
.
Ellipse
Le même que le Ellipsis littéral "...". Valeur spéciale utilisée principalement avec la syntaxe de découpage étendue pour les types de données de conteneur définis par l'utilisateur.