Do czego służy obiekt Elipsa Pythona?
Podczas bezczynnego przeglądania przestrzeni nazw zauważyłem dziwnie wyglądający obiekt o nazwie " Ellipsis ", nie wydaje się być ani nie robi nic specjalnego, ale jest to globalnie dostępny builtin.
Po przeszukaniu znalazłem, że jest on używany w jakimś niejasnym wariancie składni krojenia przez Numpy i Scipy... ale prawie nic więcej.
Czy ten obiekt został dodany do języka specjalnie w celu obsługi Numpy + Scipy? Czy Elipsa ma 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
10 answers
To pojawiło się ostatnio w innym pytaniu . Rozwiążę moją odpowiedź stamtąd:
Elipsa {[15] } jest obiektem, który może pojawić się w notacji slice. Na przykład:
myList[1:2, ..., 0]
Jego interpretacja zależy wyłącznie od tego, co implementuje funkcję __getitem__
i widzi tam obiekty Ellipsis
, ale jej głównym (i zamierzonym) zastosowaniem jest rozszerzenie numeric python, które dodaje wielowymiarowy typ tablicy. Ponieważ istnieje więcej niż jeden wymiary, krojenie staje się bardziej złożone niż tylko indeks start i stop; przydatne jest również możliwość krojenia w wielu wymiarach. Na przykład, biorąc pod uwagę tablicę 4x4, lewy górny obszar byłby zdefiniowany przez wycinek [: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]])
Rozszerzając to dalej, elipsa jest tutaj używana do wskazania elementu zastępczego dla pozostałych wymiarów tablicy, które nie zostały określone. Pomyśl o tym jako o wskazaniu pełnego wycinka [:]
dla wszystkich wymiarów w szczelinie, którą jest umieszczony, więc dla tablicy 3d a[...,0]
jest taka sama ponieważ a[:,:,0]
i dla 4d, a[:,:,:,0]
, podobnie, a[0,...,0]
jest a[0,:,:,0]
(z tym, ile dwukropków w środku składa się na pełną liczbę wymiarów w tablicy).
Co ciekawe, w python3 literał elipsy (...
) jest użyteczny poza składnią slice, więc możesz napisać:
>>> ...
Ellipsis
Inne niż różne typy liczbowe, Nie, Nie sądzę, że jest używany. O ile mi wiadomo, został dodany wyłącznie do użytku numpy i nie ma żadnej podstawowej obsługi poza dostarczaniem obiektu i odpowiadająca składnia. Obiekt, który tam był, nie wymagał tego, ale dosłowny"..."wsparcie dla plastrów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:23
W Pythonie 3, możesz użyć litery elipsy ...
jako symbolu zastępczego" nop " dla kodu:
def will_do_something():
...
To jesta nie Magia; zamiast ...
można użyć dowolnego wyrażenia, np.:
def will_do_something():
1
(nie mogę użyć słowa "usankcjonowany" , ale mogę powiedzieć, że to użycie było nie odrzucony przez Guido.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 16:23:28
Można również użyć wielokropka przy określaniu oczekiwanego wyjścia 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-31 14:47:58
W Pythonie 3.5 I PEP484 , literalna elipsa jest używana do oznaczania pewnych typów do statycznego kontrolera typów podczas używania modułu typing .
Przykład 1:
Krotki jednorodne o dowolnej długości można wyrazić za pomocą jednego typu i elipsy, na przykład
Tuple[int, ...]
Przykład 2:
Możliwe jest zadeklarowanie typu zwracanego wywołania bez podawania sygnatury wywołania przez podstawienie literalnej elipsy (trzy kropki) dla listy argumentów:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-28 13:08:47
Ten obiekt jest używany przez rozszerzony slice notacji (patrz Python Reference Instrukcja obsługi). Obsługuje Nie specjalne szef. Jest dokładnie jeden obiekt elipsy o nazwie
Ellipsis
(a wbudowana nazwa).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 11:30:30
Możesz użyć elipsy samodzielnie, w niestandardowych sytuacjach krojenia, takich jak numpy, ale nie ma zastosowania w żadnej wbudowanej klasie.
Nie wiem, czy został dodany specjalnie do użytku w numpy, ale na pewno nie widziałem go używanego gdzie indziej.
Zobacz także: Jak używać składni krojenia elipsy w Pythonie?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47
__getitem__
minimal ...
przykład w niestandardowej klasie
...
służy jako wartość magiczna klasy singleton, która jest przekazywana do __getitem__
, gdy używasz składni "wyglądającej magicznie" ...
.
Klasa może z nim robić, co chce.
Przykład:
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)
Klasa wbudowana w Pythona list
decyduje się nadać jej semantyczny zakres, a każde rozsądne użycie tego zakresu również powinno być oczywiście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 13:34:53
Podsumowując to, co powiedzieli inni, począwszy od Pythona 3, Ellipsis jest zasadniczo kolejną stałą Singletona podobną do None
, ale bez określonego zamierzonego zastosowania. Istniejące zastosowania obejmują:
- w składni slice do reprezentowania całego slice w pozostałych wymiarach
- in type hinting to indicate only part of a type (
Callable[..., int]
orTuple[str, ...]
) - w plikach wejściowych typu, aby wskazać domyślną wartość bez podawania jej
Możliwe zastosowania mogą include:
- jako domyślna wartość dla miejsc, w których
None
jest prawidłową opcją - jako zawartość funkcji, której jeszcze nie zaimplementowałeś
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-02 21:08:15
Jego przeznaczenie nie powinno być tylko dla tych modułów zewnętrznych. Nie jest to poprawnie wymienione w dokumentacji Pythona (a może po prostu nie mogłem tego znaleźć), ale ellipsis ...
jest faktycznie używany w CPython w co najmniej jednym miejscu.
Jest używany do reprezentowania nieskończonych struktur danych w Pythonie. Natknąłem się na tę notację podczas zabawy z listami.
Zobacz to pytanie aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:47
Jak wspomniano przez @ nozz and I @ Phoenix-rzeczywiście można go używać w plikach początkowych. np.
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
Więcej informacji i przykłady użycia tej elipsy można znaleźć tutaj https://www.python.org/dev/peps/pep-0484/#stub-files
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 11:11:19