Ellipsis python что такое

Объект многоточие в Python

Как-то раз я наткнулся на такой фрагмент кода на Python:

class CustomException(Exception): . 

Сначала я решил, что это просто какой-то псевдокод. В Python для заполнения тела пустой функции, которая еще не реализована, обычно используется ключевое слово pass . Я подумал: «здесь указано, что далее будет больше кода, но в этом месте код сокращен, чтобы просто понять идею». Следовательно, использование ключевого слова pass означало бы, что что-то еще не реализовано. Больше я об этом не задумывался, но иногда использовал сам, чтобы объяснить коллегам определенную концепцию.

И вот я снова наткнулся на этот элемент, на этот раз в работающем коде. Любопытство подстегнуло меня выяснить, действительно ли это такая особенность языка или просто побочный эффект чего-то другого. Это был первый раз, когда я идентифицировал объект многоточие (Ellipsis) в Python.

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

Примечание: Код, представленный в этой статье, был написан для Python 3.9 (CPython).

Общая информация

Прежде чем перейти к возможным вариантам использования, давайте для начала выясним, что представляет собой объект многоточия. По сути, это встроенная константа [1], подобная True и False:

>>> True True >>> Ellipsis Ellipsis >>> . Ellipsis

Точнее говоря, встроенная константа – это Ellipsis, а . (три точки) – соответствующий литерал. Его можно также обнаружить как определенный токен в Lib/token.py [2]:

# previous code in token.py ELLIPSIS = 52 # subsequent code in token.py

В документации сказано, что объект Ellipsis – это «специальное значение, используемое в основном в сочетании с расширенным синтаксисом среза (slice). [1] Однако я не нашел случая использования среза, несмотря на его использование в стороннем пакете NumPy [3]. В дополнение к сказанному, если вы хотите реализовать определенную функцию и вам нужен неиспользуемый литерал, можно использовать объект многоточия.

Читайте также:  Python format file size

Аннотации типов

Я довольно быстро нашел сценарий, в котором уже использовал объект многоточия: аннотации типов. Для иллюстрации этого концепта предположим, что у нас есть функция, которая принимает ноль аргументов и возвращает кортеж (tuple):

def return_tuple() -> tuple: pass

Если вы хотите дать пользователю функции больше информации, вы также можете указать, что кортеж содержит. Например, можно вернуть кортеж, состоящий из двух целых чисел:

def return_tuple() -> tuple[int, int]: pass

Примечание: Использование tuple[int, int] в качестве аннотации типа не поддерживается до версии Python 3.9. В предыдущих версиях Python используйте Tuple из модуля typing или import future.annotations .

Как аннотировать кортеж целых чисел, который может иметь любую длину больше нуля? Просто используйте многоточие:

def return_tuple() -> tuple[int, . ]: pass

И еще кое-что. Предположим, есть функция, возвращающая callable. Если сигнатура callable может меняться, можно использовать объект многоточия, чтобы указать на это:

from typing import Callable def return_callable() -> Callable[. int]: pass

Приведенный фрагмент кода означает, что возвращается callable с неизвестной сигнатурой, но тип возвращаемого callable значения указан: это целое число (integer).

Отлично! На этом этапе мы определили первый сценарий, в котором можно использовать объект многоточия в коде Python. Давайте посмотрим, как можно им воспользоваться при реализации классов и функций.

Замена ключевого слова Pass

В начале статьи уже был намек на то, что объект Ellipsis можно использовать в качестве замены ключевого слова pass . Напоминаю, что ключевое слово pass используется, если нужно определить, например, функцию, класс, цикл for, но пока без его реализации. Поскольку синтаксис Python требует отступа после этих конструкций, ключевое слово pass используется, с одной стороны, для выполнения требований синтаксиса Python, и с другой стороны, для удовлетворения ваших потребностей, поскольку вам пока не нужно реализовывать эти конструкции. Вот пример:

По сути, даже ключевое слово pass не требуется. Нужно только записать выражение. Это может быть число:

Лично мне нравится использовать ключевое слово pass , чтобы указать, что что-то реализовано именно так, как я хочу. Примером может служить создание пользовательского исключения без добавления дополнительных деталей:

class CustomException(Exception): pass

С другой стороны, использование объекта Ellipsis может указывать на то, что определенная функция еще не полностью реализована, но вызывать исключение NotImplemented кажется излишеством. Подведем итог: объект Ellipsis можно использовать в качестве замены ключевого слова pass , но делать этого не стоит, потому что есть определенная причина, по которой все используют pass . Однако в порядке вещей должно быть его использование его в статьях, чтобы указать, что далее есть строки кода.

Объект Ellipsis на практике

Как уже говорилось ранее, если вы хотите реализовать определенную функцию, где вам нужен неиспользуемый литерал, можно использовать объект многоточия. Typer [4] – пакет для реализации интерфейсов командной строки и FastAPI [5] (веб-фреймворк) являются яркими примерами его использования. В FastAPI он используется для того, чтобы сделать параметры обязательными [6], а в Typer он довольно похож: указывает на то, что требуется аргумент командной строки [7].

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

Заключение

Спасибо, что дочитали статью до конца. Мы поговорили о том, что такое объект многоточия и где его можно использовать. Возможные варианты его использования таковы: аннотации типов, замена пропусков или использование для определенных функций, где вам нужен неиспользуемый литерал. Также мы рассмотрели сторонние пакеты, использующие объект многоточия для реализации специальных возможностей.

Ссылки

Скоро состоится открытое занятие «Знакомство с веб разработкой на Flask». На уроке познакомимся с основами веб-разработки на Flask, а также научимся создавать и рендерить шаблоны страниц. Попробуем создать Flask приложение, затем создать роуты и в конце обработать различные HTTP методы на Flask. Записаться можно на странице специализации Python Developer.

Источник

Built-in Constants¶

A small number of constants live in the built-in namespace. They are:

The false value of the bool type. Assignments to False are illegal and raise a SyntaxError .

The true value of the bool type. Assignments to True are illegal and raise a SyntaxError .

An object frequently used to represent the absence of a value, as when default arguments are not passed to a function. Assignments to None are illegal and raise a SyntaxError . None is the sole instance of the NoneType type.

A special value which should be returned by the binary special methods (e.g. __eq__() , __lt__() , __add__() , __rsub__() , etc.) to indicate that the operation is not implemented with respect to the other type; may be returned by the in-place binary special methods (e.g. __imul__() , __iand__() , etc.) for the same purpose. It should not be evaluated in a boolean context. NotImplemented is the sole instance of the types.NotImplementedType type.

When a binary (or in-place) method returns NotImplemented the interpreter will try the reflected operation on the other type (or some other fallback, depending on the operator). If all attempts return NotImplemented , the interpreter will raise an appropriate exception. Incorrectly returning NotImplemented will result in a misleading error message or the NotImplemented value being returned to Python code.

NotImplementedError and NotImplemented are not interchangeable, even though they have similar names and purposes. See NotImplementedError for details on when to use it.

Changed in version 3.9: Evaluating NotImplemented in a boolean context is deprecated. While it currently evaluates as true, it will emit a DeprecationWarning . It will raise a TypeError in a future version of Python.

The same as the ellipsis literal “ . ”. Special value used mostly in conjunction with extended slicing syntax for user-defined container data types. Ellipsis is the sole instance of the types.EllipsisType type.

This constant is true if Python was not started with an -O option. See also the assert statement.

The names None , False , True and __debug__ cannot be reassigned (assignments to them, even as an attribute name, raise SyntaxError ), so they can be considered “true” constants.

Constants added by the site module¶

The site module (which is imported automatically during startup, except if the -S command-line option is given) adds several constants to the built-in namespace. They are useful for the interactive interpreter shell and should not be used in programs.

quit ( code = None ) ¶ exit ( code = None ) ¶

Objects that when printed, print a message like “Use quit() or Ctrl-D (i.e. EOF) to exit”, and when called, raise SystemExit with the specified exit code.

Objects that when printed or called, print the text of copyright or credits, respectively.

Object that when printed, prints the message “Type license() to see the full license text”, and when called, displays the full license text in a pager-like fashion (one screen at a time).

Источник

Оцените статью