Que fait L'objet Python Ellipsis?
pendant que je surfais 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 c'est un builtin disponible dans le monde entier.
après une recherche, J'ai trouvé qu'il est utilisé dans une variante obscure de la syntaxe de tranchage par Numpy et Scipy... mais presque rien d'autre.
cet objet a-t-il été ajouté au langage spécifiquement pour supporter Numpy + Scipy? N'points de suspension ont tout sens générique ou de l'utiliser à tout?
D:workspacenumpy>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
10 réponses
cela est apparu dans une autre question récemment. Je vais développer sur mon réponse de là:
points de suspension est un objet qui peut apparaître dans la tranche de notation. Par exemple:
myList[1:2, ..., 0]
son interprétation est purement jusqu'à tout ce qui met en œuvre la __getitem__
fonction et voit Ellipsis
objets, mais son utilisation principale (et prévue) est dans le Python numérique extension, qui ajoute un type de tableau multidimensionnel. Puisqu'il y a plus d'une dimension, le tranchage devient plus complexe qu'un simple index de départ et d'arrêt; il est utile de pouvoir trancher en plusieurs dimensions également. Par exemple, avec un tableau 4x4, la partie supérieure 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]])
S'étendant plus loin, Ellipsis est utilisé ici pour indiquer un placeholder pour le reste du tableau dimensions non spécifiées. Pensez - y comme une indication de la tranche complète [:]
pour toutes les dimensions dans l'espace, il est placé, donc pour un tableau 3d, a[...,0]
est le même que a[:,:,0]
et pour 4d, a[:,:,:,0]
, de même, a[0,...,0]
est a[0,:,:,0]
(avec cependant beaucoup de colons dans le milieu de constituer le nombre complet de dimensions dans le tableau).
fait intéressant, en python3, L'Ellipse littérale ( ...
) est utilisable en dehors de la syntaxe slice, donc vous pouvez en fait écrire:
>>> ...
Ellipsis
mis à part les différents types numériques, Non, Je ne pense pas qu'il soit utilisé. Pour autant que je sache, il a été ajouté uniquement pour une utilisation simple et n'a pas de support de base autre que la fourniture de l'objet et de la syntaxe correspondante. L'objet étant là ne l'exigeait pas, mais au sens littéral "..."le soutien pour les tranches a fait.
en Python 3, vous pouvez utiliser L'Ellipse littérale ...
comme un placeholder "nop" pour le code:
def will_do_something():
...
c'est pas magie; n'importe quelle 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 pas injustement rejeté par Guido.)
vous pouvez également utiliser les ellipses en spécifiant prévu 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
à partir de Python 3.5 et PEP484 , l'ellipse littérale est utilisée pour désigner certains types à un vérificateur de type statique en utilisant le module typing .
exemple 1:
les tuples homogènes de longueur arbitraire peuvent être exprimés en utilisant un type et des ellipses ,par exemple
Tuple[int, ...]
exemple 2:
il est possibilité de déclarer le type de retour d'un callable sans spécifier la signature de l'appel en remplaçant la liste des arguments par une ellipse littérale (trois points):
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
De la la documentation Python :
Cet objet est utilisé par tranche étendue notation (voir la référence Python) Manuel ). Il ne prend pas en charge particulière opérations. Il y a exactement un objet elliptique, nommé
Ellipsis
(a construit-dans le nom).
vous pouvez utiliser Ellipsis vous-même, dans des situations de tranchage personnalisées comme numpy l'a fait, mais il n'a aucun usage dans n'importe quelle classe de builtin.
je ne sais pas s'il a été ajouté spécifiquement pour une utilisation dans numpy, mais je n'en ai pas vu ailleurs.
Voir aussi: comment utilisez-vous la syntaxe de tranchage elliptique en Python?
__getitem__
minimal ...
exemple dans une classe de douane
...
Sert de valeur magique de classe singleton qui passe à __getitem__
quand vous utilisez la syntaxe "d'apparence magique" ...
.
la classe peut alors en faire ce qu'elle veut.
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 donner le sémantique d'une gamme, et toute utilisation saine de celui-ci devrait aussi bien sûr.
personnellement, je ne m'en occuperais pas dans mon API, et je créerais plutôt une méthode séparée, plus explicite.
résumant ce que d'autres ont dit, à partir de Python 3, Ellipsis est essentiellement une autre constante singleton similaire à None
, mais sans une utilisation particulière prévue. Utilisations actuelles:
- dans la syntaxe des tranches pour représenter la tranche complète dans les dimensions restantes
- dans le type suggérant de n'indiquer qu'une partie d'un type(
Callable[..., int]
ouTuple[str, ...]
) - dans les fichiers Type stub pour indiquer qu'il y a une valeur par défaut sans le préciser
utilisations possibles:
- comme valeur par défaut pour les endroits où
None
est une option valide - comme contenu pour une fonction que vous n'avez pas encore implémentée
son utilisation prévue ne devrait pas être seulement pour ces modules tiers. Il n'est pas mentionné correctement dans la documentation de Python (ou peut-être que je n'ai pas pu le trouver) mais le ellipsis ...
est en fait utilisé dans CPython à au moins un endroit.
il est utilisé pour représenter les 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.
comme l'ont mentionné @no tarz փ et @Phoenix - vous pouvez en effet L'utiliser dans les fichiers stub. par exemple
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
plus d'informations et des exemples d'utilisation de cette ellipse peuvent être trouvés ici https://www.python.org/dev/peps/pep-0484/#stub-files