Во время ленивого серфинга по пространству имен я заметил странно выглядящий объект с именем Ellipsis, похоже, он не является чем-то особенным и не делает ничего особенного, но это глобально доступный встроенный компонент.
После поиска я обнаружил, что он используется в каком-то неясном варианте синтаксиса нарезки в Numpy и Scipy... но почти ничего больше.
Этот объект был добавлен в язык специально для поддержки Numpy + Scipy? Имеет ли многоточие какое-либо общее значение или вообще используется?
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 объекты там, но его основное (и предполагаемое) использование находится в сторонней библиотеке numpy, которая добавляет тип многомерного массива. Поскольку существует более одного измерения, срез становится более сложным, чем просто начальный и конечный индексы; полезно иметь возможность срезать и в нескольких измерениях. Например., учитывая массив 4 × 4, верхняя левая область будет определяться срезом [:2, :2]:
Расширяя это далее, многоточие используется здесь для обозначения заполнителя для остальных не указанных размеров массива. Думайте об этом как о указании полного среза [:] для всех измерений в промежутке, в который он помещен, поэтому для 3d-массива, a[..., 0] то же самое, что a[:, :, 0] и для 4d a[:, :, :, 0], аналогично, a[0, ..., 0] является a[0, :, :, 0] (с любым количеством двоеточий в середине, составляющим полное количество измерений в массиве).
Интересно, что в python3 литерал Ellipsis (...) можно использовать вне синтаксиса slice , поэтому вы действительно можете написать:
>>> ... Ellipsis
РЕДАКТИРОВАТЬ: Многоточие также используется в typing модуле стандартной библиотеки: например, Callable[..., int] для указания вызываемого объекта, который возвращает int без указания подписи, или tuple[str, ...] для указания однородного набора строк переменной длины.
Ответ 2
В Python 3 вы можете1 использовать литерал Ellipsis ... в качестве заполнителя “nop” для кода, который еще не был написан:
defwill_do_something(): ...
Это не волшебство; вместо ... можно использовать любое выражение, например:
defwill_do_something(): 1
(Не могу использовать слово “санкционированный”, но могу сказать, что это использование было не отвергнуто Гвидо.)
¹ 'can' not in {'must', 'should'}
Ответ 3
Начиная с Python 3.5 и PEP484, буквенное многоточие используется для обозначения определенных типов в статической проверке типов при использовании модуля typing.
Пример 1:
Однородные кортежи произвольной длины могут быть выражены с использованием одного типа и многоточия, например Tuple[int, ...]
Пример 2:
Можно объявить возвращаемый тип вызываемого объекта без указания сигнатуры вызова, заменив список аргументов буквальным многоточием (три точки):
defpartial(func: Callable[..., str], *args) -> Callable[..., str]: # Body
Ответ 4
Подводя итог тому, что говорили другие, начиная с Python 3, Ellipsis по сути является еще одной одноэлементной константой, подобной None, но без конкретного предполагаемого использования. Существующие варианты использования включают:
Синтаксис среза для представления полного среза в оставшихся измерениях
В подсказке типа указывается только часть типа (Callable[..., int] или Tuple[str, ...])
В файлах-заглушках типа указывать, что есть значение по умолчанию, без его указания
Возможные варианты использования могут включать:
В качестве значения по умолчанию для мест, где None является допустимым параметром
В качестве содержимого для функции, которую вы еще не реализовали