python
March 7

Константа Ellipsis, литерал ...

В Python существует специальная константа Ellipsis, которая может быть полезна в разных сценариях. Ellipsis – это объект специального типа данных ellipsis.

Приведенный ниже код:

print(Ellipsis)
print(type(Ellipsis))

выводит:

Ellipsis
<class 'ellipsis'>

Вместо константы Ellipsis можно также использовать литерал ....

Приведенный ниже код:

print(... == Ellipsis)
print(... is Ellipsis)

выводит:

True
True

Мы можем присвоить значение Ellipsis (литерал ...) любой переменной. Все переменные, которым присвоено значение Ellipsis (литерал ...), ссылаются на один и тот же объект.

Приведенный ниже код:

var1 = Ellipsis
var2 = ...
var3 = Ellipsis

print(var1 is var2)
print(var1 is var3)
print(var2 is var3)

выводит:

True
True
True

💡 Объекты, существующие в единственном экземпляре, называются синглтонами. По аналогии с Ellipsis в Python существует литерал None, который также является единственным экземпляром типа NoneType.

Использование Ellipsis

Рассмотрим основные сценарии использования литерала ....

Сценарий 1. Использование в качестве заглушки при определении функции или класса. Литерал ... можно использовать в качестве альтернативы оператору pass.

Приведенный ниже код:

def func():
    pass

class Cat:
    pass

Приведенный выше код можно переписать в виде:

def func():
    ...

class Cat:
    ...

Сценарий 2. Использование при аннотации типов в случае, когда мы хотим определить кортеж (или любой итерируемые объект), содержащий неопределенное количество однотипных значений.

Приведенный ниже код:

numbers: tuple[int, ...]

определяет переменную numbers, которая представляет собой кортеж любой длины, содержащий только целые числа.

Таким образом, под определение переменной numbers подходят:

numbers = ()
numbers = (4,)
numbers = (1, 2, 3, 4)

но не подходят:

numbers = (1, 2, 'beegeek')
numbers = ('python', 12.5)

Сценарий 3. Использование при аннотации типов в случае, когда мы хотим объявить Callable-объект, принимающий произвольное количество аргументов любого типа и возвращающий значение определенного типа.

Приведенный ниже код:

from typing import Callable

func: Callable[..., int]

определяет переменную func, которая представляет собой вызываемый объект, принимающий произвольное количество аргументов любого типа и возвращающий значение типа int.

Таким образом, под определение переменной func подходят функции:

def add_5(a: int) -> int:
    return a + 5

def multiply(a: int, b: int) -> int:
    return a * b

def sum_ord(a: str, b: str) -> int:
    return ord(a) + ord(b)

но не подходят:

def as_str(a: int) -> str:
    return str(a)

def get_lower_and_upper(s: str) -> list:
    return [s.lower(), s.upper()]

Примечания

Примечание 1. В отличие от литерала None, который преобразуется встроенной функцией bool() к False, константа Ellipsis (литерал ...) преобразуется к True.

Приведенный ниже код:

print(bool(None))
print(bool(Ellipsis))
print(bool(...))

выводит:

False
True
True

Приведенный ниже код:

if ...:
    print('bee')
else:
   print('geek')

выводит:

bee