Вопрос-Ответ

What does the Ellipsis object do?

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

Во время ленивого серфинга по пространству имен я заметил странно выглядящий объект с именем 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]:

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

Расширяя это далее, многоточие используется здесь для обозначения заполнителя для остальных не указанных размеров массива. Думайте об этом как о указании полного среза [:] для всех измерений в промежутке, в который он помещен, поэтому для 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” для кода, который еще не был написан:

def will_do_something():
...

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

def will_do_something():
1

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

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

Ответ 3

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

Пример 1:


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


Пример 2:


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


def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
Ответ 4

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


  • Синтаксис среза для представления полного среза в оставшихся измерениях

  • В подсказке типа указывается только часть типа (Callable[..., int] или Tuple[str, ...])

  • В файлах-заглушках типа указывать, что есть значение по умолчанию, без его указания

Возможные варианты использования могут включать:


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

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

2023-06-20 15:07 python