Podczas bezczynnego przeglądania przestrzeni nazw zauważyłem dziwnie wyglądający obiekt o nazwie Ellipsis
, nie wydaje się, że jest ani nie robi nic specjalnego, ale jest wbudowanym globalnie narzędziem.
Po wyszukiwaniu odkryłem, że jest on używany w jakimś niejasnym wariancie składni krojenia przez Numpy i Scipy ... ale prawie nic innego.
Czy ten obiekt został dodany do języka specjalnie w celu obsługi Numpy + Scipy? Czy elipsa ma w ogóle jakieś ogólne znaczenie lub zastosowanie?
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)
, aby zobaczyć, jak radzi sobie ze strajkami cyklicznych obiektów. Wrócił[[...]]
. Pomyślałem: „Zastanawiam się, co się stanie, jeśli napiszę[[...]]
? Zgaduję, że spowodowałoby to błąd składniowy. Zamiast tego wrócił[[Ellipsis]]
. Python jest taki dziwny. Wyszukiwanie Google przywiodło mnie na tę stronę....
rekursywne powtórzenie jest tylko symbolem zastępczym i nie ma związku zEllipsis
Odpowiedzi:
To pojawiło się niedawno w innym pytaniu . Stamtąd rozwinę moją odpowiedź :
Elipsa jest obiektem, który może pojawić się w notacji plastra. Na przykład:
Jego interpretacja zależy wyłącznie od tego, co implementuje
__getitem__
funkcję i widzi w niejEllipsis
obiekty, ale jej główne (i zamierzone) zastosowanie znajduje się w numpy zewnętrznej bibliotece, która dodaje wielowymiarowy typ tablicy. Ponieważ istnieje więcej niż jeden wymiar, krojenie staje się bardziej złożone niż tylko indeks start i stop; przydatne jest również cięcie na wiele wymiarów. Na przykład, biorąc pod uwagę tablicę 4x4, lewy górny obszar byłby zdefiniowany przez plasterek[:2,:2]
:Rozszerzając to dalej, Ellipsis służy tutaj do wskazania symbolu zastępczego dla pozostałych nieokreślonych wymiarów tablicy. Pomyśl o tym jako o wskazaniu pełnego wycinka
[:]
dla wszystkich wymiarów w szczelinie, w której jest umieszczony, więc dla tablicy 3da[...,0]
jest taki sam jaka[:,:,0]
i dla 4da[:,:,:,0]
, podobniea[0,...,0]
jesta[0,:,:,0]
(z jednak wieloma dwukropkami pośrodku tworzą pełną liczbę wymiarów w tablicy).Co ciekawe, w python3, literał Ellipsis (
...
) jest użyteczny poza składnią plastra, więc możesz napisać:Poza różnymi typami liczbowymi, nie, nie sądzę, żeby był używany. O ile mi wiadomo, został dodany wyłącznie do użytku numpy i nie ma żadnej podstawowej obsługi poza dostarczeniem obiektu i odpowiedniej składni. Obiekt znajdujący się tam nie wymagał tego, ale dosłowna obsługa „...” wycinków tak.
źródło
typing
module biblioteki standardowej : np. WCallable[..., int]
celu wskazania wywołania, które zwraca znakint
bez określania podpisu, lub wTuple[str, ...]
celu wskazania jednorodnej krotki ciągów o zmiennej długości.a = [1, 2]; a[0] = a; print(a)
daje[[...], 2]
. Czy to to samo, czy inne zastosowanie?W Pythonie 3 możesz użyć literału Ellipsis
...
jako „zastępczego” symbolu zastępczego dla kodu:To nie jest magia; zamiast wyrażenia można użyć dowolnego wyrażenia
...
, np .:(Nie mogę użyć słowa „sankcjonowane”, ale mogę powiedzieć, że Guido nie odrzucił tego użycia ).
źródło
...
używane jest, gdy ludzie chcą wskazać coś, co zamierzają wypełnić później (pusty blok „do zrobienia”), apass
to znaczy blok, który nie ma kodu.NotImplemented
literał, który jest przydatny, gdy chcesz, aby niekompletna funkcja zwróciła coś znaczącego (zamiastNone
jak w twoim przykładzie). (KolejnyNotImplemented = 'something_else'
jest poprawny python, ale... = 'something_else'
jest to błąd składniowy.NotImplemented
nie jest alternatywą dlaNone
. Jego użycie jest raczej wąskie. Zobacz dokumentację tutajPocząwszy od Python 3.5 i PEP484 , dosłowna wielokropek jest używana do oznaczania niektórych typów statycznego sprawdzania typów podczas korzystania z modułu pisania .
Przykład 1:
Przykład 2:
źródło
Można także użyć wielokropka podczas określania oczekiwanego wyniku doctest :
źródło
...
są składniowe, a nieuse
rzeczywisty obiekt Ellipsis. Czy tak naprawdę nie jest to nic innego jak przydatna nazwa adaptowalnej koncepcji?Z dokumentacji Python :
źródło
Podsumowując, co powiedzieli inni, począwszy od Pythona 3, Ellipsis jest zasadniczo kolejną stałą singletonu podobną do
None
, ale bez określonego zamierzonego zastosowania. Istniejące zastosowania obejmują:Callable[..., int]
lubTuple[str, ...]
)Możliwe zastosowania mogą obejmować:
None
jest poprawna opcjaźródło
__getitem__
minimalny...
przykład w klasie niestandardowejKiedy magiczna składnia
...
zostanie przekazana[]
w klasie niestandardowej,__getitem__()
otrzymujeEllipsis
obiekt klasy.Klasa może wtedy robić co chce z tym obiektem Singleton.
Przykład:
Wbudowana
list
klasa Python decyduje się na semantykę zakresu, a każde rozsądne użycie go również powinno oczywiście.Osobiście trzymałbym się z dala od tego w moich interfejsach API i zamiast tego stworzyłem osobną, bardziej jednoznaczną metodę.
Testowane w Python 3.5.2 i 2.7.12.
źródło
Możesz używać Ellipsis samodzielnie, w niestandardowych sytuacjach krojenia, takich jak Numpy, ale nie ma zastosowania w żadnej wbudowanej klasie.
Nie wiem, czy został dodany specjalnie do użycia w numpy, ale na pewno nie widziałem go używanego gdzie indziej.
Zobacz także: Jak korzystać ze składni krojenia elipsy w Pythonie?
źródło
Jak wspomniano przez @ noɥʇʎԀʎzɐɹƆ i @phoenix - Rzeczywiście można go używać w plikach pośredniczących. na przykład
Więcej informacji i przykłady korzystania z tej wielokropka można znaleźć tutaj https://www.python.org/dev/peps/pep-0484/#stub-files
źródło
Jego przeznaczenie nie powinno dotyczyć tylko tych modułów innych firm. Nie jest to odpowiednio wymienione w dokumentacji Pythona (a może po prostu nie mogłem tego znaleźć), ale elipsa
...
jest faktycznie używana w CPython w co najmniej jednym miejscu.Służy do reprezentowania nieskończonych struktur danych w Pythonie. Natknąłem się na ten zapis, bawiąc się listami.
Zobacz to pytanie, aby uzyskać więcej informacji.
źródło
ellipsis
wbudowanego typu iEllipsis
obiektu. Reprezentowanie nieskończonych struktur danych za pomocą elips służy wyłącznie do wyświetlania, nie ma nic wspólnego zellipsis
typem lubEllipsis
obiektem.__repr__
ciągi Pythona mają być prawidłowymi wyrażeniami Pythona - gdyby nie elipsa występująca w tym języku, reprezentacja nie byłaby prawidłowym wyrażeniem.eval(repr(a))
celu być równyma
. Niestety w praktyce jest to nieprawda, nawet dla typów wbudowanych. Spróbuj tego:a=[]; a.append(a); eval(repr(a))
.repr(a)
to[[...]]
niepoprawne wyrażenie w Pythonie 2. (W Pythonie 3 jest poprawne, ale wynik ewaluacji jest czymś innym, wciąż sprzecznym z pierwotną intencją.)To jest równoważne.
...
jest stałą zdefiniowaną w środkubuilt-in constants
.źródło