Enquanto navegava ociosamente no namespace, notei um objeto de aparência estranha chamado Ellipsis
, ele não parece ser ou faz nada de especial, mas é um componente disponível globalmente.
Após uma pesquisa, descobri que ele é usado em alguma variante obscura da sintaxe de fatiamento por Numpy e Scipy ... mas quase nada mais.
Este objeto foi adicionado ao idioma especificamente para oferecer suporte ao Numpy + Scipy? A elipse tem algum significado ou uso genérico?
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 como ele lidava com objetos cíclicos estritos. Voltou[[...]]
. Pensei: "Gostaria de saber o que acontece se eu digitar[[...]]
. Meu palpite era que isso geraria um erro de sintaxe. Em vez disso, ele retornou[[Ellipsis]]
. Python é tão estranho. A pesquisa do Google que me seguiu me levou a esta página....
em um repr recursiva é apenas um espaço reservado e não tem relação comEllipsis
Respostas:
Isso surgiu em outra questão recentemente. Vou elaborar minha resposta a partir daí:
Elipse é um objeto que pode aparecer na notação de fatia. Por exemplo:
Sua interpretação é puramente até o que quer que implementa a
__getitem__
função e vêEllipsis
objetos lá, mas a sua principal (e intencional) uso está no numpy biblioteca de terceiros, que adiciona um tipo de matriz multidimensional. Como existem mais de uma dimensão, o fatiamento se torna mais complexo do que apenas um índice de início e parada; é útil poder cortar em várias dimensões também. Por exemplo, dada uma matriz 4x4, a área superior esquerda seria definida pela fatia[:2,:2]
:Estendendo isso ainda mais, as reticências são usadas aqui para indicar um espaço reservado para o restante das dimensões da matriz não especificadas. Pense nisso como indicando a fatia completa
[:]
para todas as dimensões da lacuna em que está posicionada; portanto, para uma matriz 3d,a[...,0]
é a mesma quea[:,:,0]
para 4da[:,:,:,0]
, da mesma forma quea[0,...,0]
éa[0,:,:,0]
(com quantos dois pontos no meio compõem o número completo). de dimensões na matriz).Curiosamente, em python3, o Ellipsis literal (
...
) é utilizável fora da sintaxe da fatia, para que você possa realmente escrever:Além dos vários tipos numéricos, não, acho que não é usado. Tanto quanto sei, foi adicionado apenas para uso numpy e não possui suporte básico além de fornecer o objeto e a sintaxe correspondente. O objeto que estava lá não exigia isso, mas o suporte literal "..." para fatias exigia.
fonte
typing
módulo da biblioteca padrão : por exemplo,Callable[..., int]
para indicar uma chamada que retorna umint
sem especificar a assinatura ouTuple[str, ...]
para indicar uma tupla homogênea de strings de comprimento variável.a = [1, 2]; a[0] = a; print(a)
dá[[...], 2]
. É a mesma coisa ou um uso diferente?No Python 3, você pode usar o literal Ellipsis
...
como um espaço reservado "nop" para o código:Isso não é mágico; qualquer expressão pode ser usada em vez de
...
, por exemplo:(Não é possível usar a palavra "sancionado", mas posso dizer que esse uso não foi totalmente rejeitado por Guido.)
fonte
...
uso em que as pessoas desejam indicar algo que pretendem preencher mais tarde (um bloco vazio 'todo') epass
significar um bloco destinado a não ter código.NotImplemented
literal, que é útil quando você deseja que sua função incompleta retorne algo significativo (em vez deNone
como no seu exemplo). (Outra usecase: Implementação de operações aritméticas )NotImplemented = 'something_else'
é python válido, mas... = 'something_else'
é um erro de sintaxe.NotImplemented
não pretende ser uma alternativa paraNone
. Seu uso é bastante restrito. Veja a documentação aquiNo Python 3.5 e no PEP484 , as reticências literais são usadas para indicar certos tipos para um verificador de tipo estático ao usar o módulo de digitação .
Exemplo 1:
Exemplo 2:
fonte
Você também pode usar as reticências ao especificar a saída esperada do doctest :
fonte
...
sejam sintáticos, e nãouse
o objeto de elipse real. Não é realmente nada além de um nome útil para um conceito adaptável?Na documentação do Python :
fonte
Resumindo o que outros disseram, a partir do Python 3, o Ellipsis é essencialmente outra constante singleton semelhante a
None
, mas sem um uso específico pretendido. Os usos existentes incluem:Callable[..., int]
ouTuple[str, ...]
)Os usos possíveis podem incluir:
None
é uma opção válidafonte
__getitem__
...
exemplo mínimo em uma classe personalizadaQuando a sintaxe mágica
...
é passada para[]
uma classe personalizada,__getitem__()
recebe umEllipsis
objeto de classe.A classe pode fazer o que quiser com esse objeto Singleton.
Exemplo:
A
list
classe interna do Python escolhe fornecer a semântica de um intervalo, e qualquer uso sensato dela também deve.Pessoalmente, eu ficaria longe disso nas minhas APIs e criaria um método separado e mais explícito.
Testado em Python 3.5.2 e 2.7.12.
fonte
Você pode usar as reticências você mesmo, em situações de fatiamento personalizadas, como o numpy fez, mas não tem uso em nenhuma classe incorporada.
Não sei se foi adicionado especificamente para uso em numpy, mas certamente não o vi usado em outros lugares.
Consulte também: Como você usa a sintaxe de corte de reticências no Python?
fonte
Conforme mencionado por @ noɥʇʎԀʎzɐɹƆ e @phoenix - você pode realmente usá-lo em arquivos stub. por exemplo
Mais informações e exemplos de como usar essas reticências podem ser encontradas aqui https://www.python.org/dev/peps/pep-0484/#stub-files
fonte
Seu uso pretendido não deve ser apenas para esses módulos de terceiros. Ele não é mencionado corretamente na documentação do Python (ou talvez eu simplesmente não tenha conseguido encontrá-lo), mas as reticências
...
são realmente usadas no CPython em pelo menos um local.É usado para representar infinitas estruturas de dados em Python. Eu me deparei com essa notação enquanto brincava com listas.
Veja esta pergunta para mais informações.
fonte
ellipsis
tipo interno e oEllipsis
objeto. Representar estruturas de dados infinitas com elipses é apenas para exibição, não tendo nada a ver comellipsis
tipo ouEllipsis
objeto.__repr__
seqüências de caracteres Python visam ser expressões válidas em Python - se não fosse por reticências existentes na linguagem, a representação não seria uma expressão válida.eval(repr(a))
ser igual aa
. Infelizmente, é falso de tempos em tempos na prática, mesmo para tipos internos. Tente isto:a=[]; a.append(a); eval(repr(a))
.repr(a)
é[[...]]
, expressão inválida no Python 2. (Em Python 3 é válida, mas o resultado eval é algo diferente, ainda contrária à intenção original.)Isso é equivalente.
...
é uma constante definida por dentrobuilt-in constants
.fonte