8

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

18

Во время случайного серфинга по пространству имен я наткнулся на странный объект под названием Ellipsis. Он не кажется чем-то особыми или выполняющим какую-то специальную функцию, но при этом является встроенным объектом, доступным глобально.

После небольшого поиска я выяснил, что Ellipsis используется в какой-то неясной вариации синтаксиса срезов в библиотеках Numpy и Scipy, но практически нигде больше.

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

D:\workspace\numpy>python
Python 2.4.4 (#71, 18 окт 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] на win32
Введите "help", "copyright", "credits" или "license" для получения дополнительной информации.
>>> Ellipsis
Ellipsis

4 ответ(ов)

0

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

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

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

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

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

Класс может обрабатывать этот объект-синглтон любым удобным для него способом.

Пример:

class C(object):
    def __getitem__(self, k):
        return k

# Один аргумент передается напрямую.
assert C()[0] == 0

# Несколько индексов генерируют кортеж.
assert C()[0, 1] == (0, 1)

# Запись среза генерирует объект среза.
assert C()[1:2:3] == slice(1, 2, 3)

# Пустые элементы среза становятся None.
assert C()[:2:] == slice(None, 2, None)

# Запись с использованием Ellipsis генерирует объект класса Ellipsis.
# Ellipsis является синглтоном, поэтому мы можем сравнивать с помощью `is`.
assert C()[...] is Ellipsis

# Все перемешано.
assert C()[1, 2:3:4, ..., 6, :7:, ..., 8] == \
       (1, slice(2, 3, 4), Ellipsis, 6, slice(None, 7, None), Ellipsis, 8)

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

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

Тестировалось в Python 3.5.2 и 2.7.12.

0

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

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

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

0

В FastAPI используется троеточие (...) для обозначения обязательных параметров. Это позволяет разработчикам явно указать, какие параметры являются обязательными, а какие — опциональными. Например, если вы хотите указать, что параметр является обязательным, вы можете использовать следующий синтаксис:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
async def read_item(param: str = ...):
    return {"param": param}

В этом примере параметр param является обязательным, и если клиент не предоставит его при запросе, FastAPI автоматически сгенерирует ответ об ошибке с указанием на необходимость этого параметра. Если вы хотите сделать параметр опциональным, достаточно просто указать значение по умолчанию, например, param: str = None.

Это позволяет легко управлять входными данными и обеспечивает хорошую документацию по API, так как FastAPI автоматически генерирует Swagger UI для ваших маршрутов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь