Mientras navegaba distraídamente por el espacio de nombres, noté que se llamaba un objeto de aspecto extraño Ellipsis
, que no parece ser o no hace nada especial, pero es un componente incorporado disponible a nivel mundial.
Después de una búsqueda descubrí que Numpy y Scipy lo usan en alguna variante oscura de la sintaxis de corte ... pero casi nada más.
¿Se agregó este objeto al lenguaje específicamente para admitir Numpy + Scipy? ¿Ellipsis tiene algún significado genérico o uso?
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)
para ver cómo manejaba la cadena de objetos cíclicos. Se volvió[[...]]
. Pensé "Me pregunto qué sucede si escribo en[[...]]
mi suposición era que arrojaría un error de sintaxis En cambio, volvió?.[[Ellipsis]]
Python es tan raro de búsqueda Google El que me sobrevino trajo a esta página......
en cuenta que en una repetición recursiva es solo un marcador de posición y no tiene relación conEllipsis
Respuestas:
Esto surgió en otra pregunta recientemente. Explicaré mi respuesta a partir de ahí:
Elipsis es un objeto que puede aparecer en notación de corte. Por ejemplo:
Su interpretación es puramente hasta cualquier implementa la
__getitem__
función y veEllipsis
los objetos allí, pero su principal (y la intención) es el uso en el numpy biblioteca de terceros, lo que añade un tipo de matriz multidimensional. Como hay más de una dimensión, el corte se vuelve más complejo que solo un índice de inicio y detención; También es útil poder cortar en varias dimensiones. Por ejemplo, dada una matriz 4x4, el área superior izquierda estaría definida por el segmento[:2,:2]
:Extendiendo esto más, Elipsis se usa aquí para indicar un marcador de posición para el resto de las dimensiones de la matriz no especificadas. Piense en ello como indicando el corte completo
[:]
para todas las dimensiones en el espacio en el que se coloca, por lo que para una matriz 3D,a[...,0]
es iguala[:,:,0]
y para 4da[:,:,:,0]
, de manera similar,a[0,...,0]
esa[0,:,:,0]
(con sin embargo muchos signos de dos puntos en la composición media de hasta el número completo de dimensiones en la matriz).Curiosamente, en python3, el Elipsis literal (
...
) se puede usar fuera de la sintaxis de corte, por lo que puede escribir:Aparte de los diversos tipos numéricos, no, no creo que se use. Hasta donde yo sé, se agregó únicamente para un uso complejo y no tiene soporte principal aparte de proporcionar el objeto y la sintaxis correspondiente. El objeto que estaba allí no requería esto, pero el soporte literal "..." para los cortes sí.
fuente
typing
módulo de biblioteca estándar : por ejemplo,Callable[..., int]
para indicar un invocable que devuelve unint
sin especificar la firma, oTuple[str, ...]
para indicar una tupla homogénea de cadenas de longitud variable.a = [1, 2]; a[0] = a; print(a)
da[[...], 2]
. ¿Es esto lo mismo o un uso diferente?En Python 3, puede usar el literal de puntos suspensivos
...
como un marcador de posición "nop" para el código:Esto no es magia; se puede usar cualquier expresión en lugar de
...
, por ejemplo:(No puedo usar la palabra "sancionado", pero puedo decir que Guido no rechazó este uso ).
fuente
...
que las personas quieren indicar algo que tienen la intención de completar más adelante (un bloque vacío 'todo') ypass
significan un bloque que no tiene código.NotImplemented
literal, que es útil cuando desea que su función incompleta devuelva algo significativo (en lugar deNone
como en su ejemplo). (Otro caso de uso: Implementación de operaciones aritméticas )NotImplemented = 'something_else'
es Python válido, pero... = 'something_else'
es un error de sintaxis.NotImplemented
no pretende ser una alternativa aNone
. Su uso es bastante limitado. Ver documentación aquíA partir de Python 3.5 y PEP484 , los puntos suspensivos literales se usan para denotar ciertos tipos a un verificador de tipo estático cuando se usa la escritura módulo de .
Ejemplo 1:
Ejemplo 2
fuente
También puede usar los puntos suspensivos al especificar la salida doctest esperada :
fuente
...
sean sintácticos, y nouse
el objeto de puntos suspensivos real. ¿No es realmente nada más que un nombre práctico para un concepto adaptable?De la documentación de Python :
fuente
Resumiendo lo que otros han dicho, a partir de Python 3, Ellipsis es esencialmente otra constante singleton similar a
None
, pero sin un uso previsto particular. Los usos existentes incluyen:Callable[..., int]
oTuple[str, ...]
)Los posibles usos podrían incluir:
None
es una opción válidafuente
__getitem__
...
ejemplo mínimo en una clase personalizadaCuando la sintaxis mágica
...
se pasa a[]
una clase personalizada,__getitem__()
recibe unEllipsis
objeto de clase.La clase puede hacer lo que quiera con este objeto Singleton.
Ejemplo:
El Python incorporado
list
clase elige darle la semántica de un rango, y cualquier uso sensato de él también debería, por supuesto.Personalmente, me mantendría alejado de esto en mis API y crearía un método separado y más explícito.
Probado en Python 3.5.2 y 2.7.12.
fuente
Puede usar puntos suspensivos usted mismo, en situaciones de corte personalizado como numpy lo ha hecho, pero no tiene uso en ninguna clase integrada.
No sé si se agregó específicamente para usar en numpy, pero ciertamente no lo he visto usado en otro lugar.
Ver también: ¿Cómo se usa la sintaxis de corte de puntos suspensivos en Python?
fuente
Como lo mencionaron @ noɥʇʎԀʎzɐɹƆ y @phoenix: de hecho, puede usarlo en archivos stub. p.ej
Puede encontrar más información y ejemplos de cómo usar estos puntos suspensivos aquí https://www.python.org/dev/peps/pep-0484/#stub-files
fuente
Su uso previsto no debería ser solo para estos módulos de terceros. No se menciona correctamente en la documentación de Python (o tal vez simplemente no pude encontrar eso), pero los puntos suspensivos
...
se usan en CPython en al menos un lugar.Se utiliza para representar estructuras de datos infinitas en Python. Encontré esta notación mientras jugaba con las listas.
Vea esta pregunta para más información.
fuente
ellipsis
incorporado y alEllipsis
objeto. La representación de estructuras de datos infinitas con puntos suspensivos es puramente para mostrar, no tiene nada que ver con elellipsis
tipo o elEllipsis
objeto.__repr__
cadenas de Python pretenden ser expresiones Python válidas; si no fuera por los puntos suspensivos existentes en el lenguaje, la representación no sería una expresión válida.eval(repr(a))
intención de ser igual aa
. Desafortunadamente, es falso de vez en cuando en la práctica, incluso para los tipos incorporados. Trate de hacer esto:a=[]; a.append(a); eval(repr(a))
.repr(a)
es decir[[...]]
, expresión inválida en Python 2. (En Python 3 es válido, pero el resultado de la evaluación es algo diferente, aún contrario a la intención original.)Esto es equivalente
...
Es una constante definida en su interiorbuilt-in constants
.fuente