Что такое объект Ellipsis?
Во время случайного серфинга по пространству имен я наткнулся на странный объект под названием 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 ответ(ов)
Всё, что было сказано другими, сводится к тому, что начиная с Python 3, Ellipsis
(троеточие) по сути является еще одной константой-синглтоном, аналогичной None
, но не имеющей конкретного предназначения. Существующие применения включают:
- В синтаксисе срезов для представления полного среза в оставшихся измерениях.
- В аннотациях типов, чтобы указать лишь часть типа (
Callable[..., int]
илиTuple[str, ...]
). - В файлах-заглушках типов, чтобы показать, что есть значение по умолчанию без его конкретизации.
Возможные варианты использования могут включать:
- В качестве значения по умолчанию в тех местах, где
None
является допустимым вариантом. - В качестве содержимого для функции, которую вы еще не реализовали.
При использовании магической синтаксической конструкции ...
в пользовательском классе, метод __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.
Как уже упоминали @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
В 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 для ваших маршрутов.
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Как явно освободить память в Python?
Выбор строки из pandas Series/DataFrame по целочисленному индексу