Что делает объект Python Ellipsis?

В то время как бездельничая серфинг в пространстве имен, я заметил нечетный объект с названием " Эллипсис", он, похоже, не является чем-то особенным, но обладает глобально доступным встроенным.

После поиска я обнаружил, что он используется в некотором неясном варианте синтаксиса разрезания Numpy и Scipy... но почти ничего.

Был ли этот объект добавлен к языку специально для поддержки Numpy + Scipy? Есть ли у Ellipsis какое-либо общее значение или вообще используется?

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

Ответы

Ответ 1

Это возникло в другой вопрос недавно. Я уточню мой ответ оттуда:

Многоточие - это объект, который может появляться в обозначениях срезов. Например:

myList[1:2, ..., 0]

Его интерпретация является чисто до любой реализует __getitem__ функцию и видит Ellipsis объекты, но его основной (и предназначен) использование в числовом питона расширение, которое добавляет многомерный тип массива. Поскольку существует более одного измерения, нарезка становится более сложной, чем просто индекс начала и остановки; полезно также иметь возможность нарезать в нескольких измерениях. Например, для массива 4x4 верхняя левая область будет определяться срезом [: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]])

Расширяя это далее, Ellipsis используется здесь, чтобы указать заполнитель для остальных измерений массива, не указанных. Думайте об этом как об указании полного среза [:] для всех измерений в зазоре, в котором он размещен, поэтому для трехмерного массива a[...,0] совпадает a[:,:,0] и для 4d, a[:,:,:,0], аналогично, a[0,...,0] - a[0,:,:,0] (хотя многие колоны в середине составляют полное число размеры в массиве).

Интересно, что в python3 литерал Ellipsis (...) может использоваться вне синтаксиса слайса, поэтому вы можете написать:

>>> ...
Ellipsis

Кроме различных числовых типов, нет, я не думаю, что это используется. Насколько я знаю, он был добавлен исключительно для простого использования и не поддерживает ядро, кроме предоставления объекта и соответствующего синтаксиса. Объект, находящийся там, не требовал этого, но буквальная "..." поддержка срезов сделала.

Ответ 2

В Python 3 вы можете использовать литерал Ellipsis ... как "nop" placeholder для кода:

def will_do_something():
    ...

Это не магия; любое выражение может использоваться вместо ..., например:

def will_do_something():
    1

(Нельзя использовать слово "санкционированный", но я могу сказать, что это использование было которое не было отвергнуто) Guido.)

Ответ 3

Вы также можете использовать Ellipsis при указании ожидаемого 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

Ответ 4

Начиная с Python 3.5 и PEP484, буквальный эллипс используется для обозначения определенных типов для проверки статического типа при использовании typing.

Пример 1:

Однородные кортежи произвольной длины могут быть выражены с использованием одного типа и многоточия, например Tuple[int, ...]

Пример 2:

Можно объявить возвращаемый тип вызываемого без указания сигнатуры вызова, заменив литеральный многоточие (три точки) для списка аргументов:

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body

Ответ 5

Из Документация по Python:

Этот объект используется расширенным срезом (см. Python Reference Руководство). Он не поддерживает никаких специальных операции. Существует ровно один эллипсовый объект, названный Ellipsis (a встроенное имя).

Ответ 6

Подводя итог тому, что говорили другие, с Python 3, Ellipsis по существу является еще одной константой синглтона, подобной None, но без какого-либо конкретного использования. Существующие виды использования включают:

  • В синтаксисе среза для представления полного фрагмента в остальных измерениях
  • В типе намекает указать только часть типа (Callable[..., int] или Tuple[str,...])
  • В типах файлов-заглушек указывается значение по умолчанию без указания его

Возможное использование может включать:

  • В качестве значения по умолчанию для мест, где None является допустимым параметром
  • Как контент для функции, которую вы еще не реализовали

Ответ 7

Вы можете использовать Ellipsis самостоятельно, в пользовательских ситуациях среза, таких как numpy, но он не имеет использования ни в одном встроенном классе.

Я не знаю, добавлено ли оно специально для использования в numpy, но я, конечно, не видел, чтобы он использовался где-то в другом месте.

См. также: Как использовать синтаксис разрезания многоточия в Python?

Ответ 8

__getitem__ minimal ... пример в пользовательском классе

Когда магический синтаксис ... переходит в руки [] в пользовательском классе, __getitem__() получает Ellipsis объект класса.

Затем класс может делать все, что захочет, с этим объектом Singleton.

Пример:

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)

Класс встроенного list Python выбирает, чтобы дать ему семантику диапазона, и любое разумное использование этого также, конечно, должно.

Лично я бы просто избегал этого в своих API и вместо этого создал бы отдельный, более явный метод.

Протестировано в Python 3.5.2 и 2.7.12.

Ответ 9

Его предполагаемое использование должно быть не только для этих сторонних модулей. Он не упоминается должным образом в документации Python (или, может быть, я просто не мог этого найти), но эллипсис ... фактически используется в CPython по крайней мере в одном месте.

Он используется для представления бесконечных структур данных в Python. Я столкнулся с этой нотой, играя со списками.

Подробнее см. этот вопрос.

Ответ 10

Как уже упоминалось @noɥʇʎԀʎzɐɹƆ и @phoenix - вы действительно можете использовать его в файлах-заглушках. например

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...

Дополнительную информацию и примеры использования этого многоточия можно найти здесь https://www.python.org/dev/peps/pep-0484/#stub-files.

Ответ 11

@Matthew D. Scholefield: просто короткое замечание похоже на то, что синтаксис нарезки многоточия ограничен только массивами/матрицами, а не встроенным списком Python.

Ответ 12

Это эквивалентно.

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

... это константа, определенная внутри built-in constants.

эллипсис

Так же, как и многоточие буквально "...". Специальное значение используется в основном в сочетании с расширенным синтаксисом секционирования для пользовательских типов данных контейнера.