Do czego służy obiekt Elipsa?

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
Author: martineau, 2009-04-21

13 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]

Jej interpretacja zależy wyłącznie od tego, co implementuje funkcję __getitem__ i widzi tam obiekty Ellipsis, ale jej główne (i zamierzone) zastosowanie znajduje się w numpy trzeciej biblioteki, która 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.

 628
Author: Brian,
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
2020-04-12 08:53:43

W Pythonie 3 możesz 1 używać litery Elipsa ... jako symbolu zastępczego" nop " dla kodu, który nie został jeszcze napisany:

def will_do_something():
    ...

To jest a 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.)

¹ 'can' not in {'must', 'should'}

 256
Author: tzot,
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
2020-09-21 09:54:23

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
 86
Author: phoenix,
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

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
 47
Author: Chiggs,
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

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] or Tuple[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ś
 37
Author: Matthew D. Scholefield,
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

Z dokumentacji Pythona :

Ten obiekt jest powszechnie używany przez krojenie (zobacz plastry). Obsługuje nie operacje specjalne. Istnieje dokładnie jeden obiekt elipsy, nazwany Elipsa (nazwa wbudowana). type(Ellipsis)() tworzy elipsę singleton.

Zapisywany jest jako Ellipsis lub ....

 36
Author: Simon Lieschke,
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
2020-03-11 19:32:23

__getitem__ minimal ... przykład w klasie niestandardowej

Kiedy magiczna składnia ... zostanie przekazana do [] w niestandardowej klasie, __getitem__() otrzymuje obiekt klasy Ellipsis.

Klasa może wtedy robić co chce z tym pojedynczym obiektem.

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.

Osobiście trzymałbym się od tego z daleka w moich API i tworzyłbym osobna, bardziej jednoznaczna metoda.

Testowane w Pythonie 3.5.2 i 2.7.12.

 16
Author: Ciro Santilli TRUMP BAN IS BAD,
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
2019-04-11 12:56:33

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?

 13
Author: sykora,
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

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

 9
Author: henryJack,
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
2019-05-28 08:20:51

To jest równoważne.

l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

... jest stałą określoną wewnątrz built-in constants.

Elipsa

Tak samo jak literał elipsy"...". Specjalna wartość używana głównie w połączeniu z rozszerzoną składnią krojenia dla zdefiniowanych przez użytkownika typów danych kontenerów.

 3
Author: prosti,
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
2020-06-20 09:12:55

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.

 2
Author: Aseem Bansal,
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

W typer ... jest używany do tworzenia wymaganych parametrów: klasa Argument oczekuje wartości domyślnej, a jeśli przekażesz ... będzie narzekać, jeśli użytkownik nie przekaże określonego argumentu.

Mógłbyś użyć None do tego samego, gdyby Ellipsis nie było, ale to pozbawiłoby możliwość wyrażenia, że None jest wartością domyślną, na wypadek gdyby miało to jakikolwiek sens w twoim programie.

 0
Author: user4344,
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
2020-10-03 06:29:54

FastAPI używa elipsy do tworzenia wymaganych parametrów. https://fastapi.tiangolo.com/tutorial/query-params-str-validations/

 0
Author: Irrer Polterer,
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
2021-01-29 22:58:30