Посмотрите на эту функцию
def my_func():
x = 1
y = 2
...
return x+y
Если я запущу её в таком виде, какую ошибку получу?
Похоже на пример из урока. Скорее всего будет SyntaxError из-за троеточия (...).
Но если вы выполните этот код... ОШИБКИ НЕ БУДЕТ😳!
Почему❓
Всё дело в том что троеточие это одна из стандартных констант в Python, называется Ellipsis. Такая же как None, True или False.
Это не какой-то тип данных, для него нет каких-либо специальных операторов. Нигде в стандартной библиотеке он не используется.
Хотя, может в распечатке объектов с бесконечной рекурсией (но это не точно).
>>> x = []
>>> x.append(x)
>>> print(x)
[[...]]
Так где же применять эту штуку?
Прежде всего, стоит заметить что этот объект кажется достаточно неуместным для Python.
Ведь Python такой логичный и минималистичный и тут вдруг бесполезная константа которая нигде не встречается!
Но всё же давайте посмотрим как эта константа может быть использована.
🔸Особый синтаксис срезов
В документации написано что Ellipsis используется для "extended slicing syntax".
Это значит что он используется в слайсинге, но не в стандартном. Его можно применить в расширенном слайсинге, то есть когда переопределяете метод __getitem__ в ваших классах.
>>> class C(object):
>>> def __getitem__(self, item):
>>> return item
Если вы попробуем получить нечто по индексу то в item прилетает этот индекс
>>> C()[1]
1
Но если передать в квадратные скобки несколько аргументов, то в item прилетает кортеж
>>> C()[1, 10]
(1, 10)
Вам остаётся решить как обработать такие аргументы и вернуть "срез" вашего типа.
Ну и ничто не мешает нам использовать (...) в качестве "синтаксического сахара" для реализации какой-то особой логики.
>>> C()[1, ..., 10]
(1, Ellipsis, 10)
>>> C()[3:...]
slice(3, Ellipsis, None)
Вам остаётся лишь решить как именно обработать такой запрос.
Например так:
>>> class C(object):
>>> def __getitem__(self, item):
>>> if item is Ellipsis:
>>> return "RETURN ALL"
>>> return "RETURN BY INDEX"
>>> C()[...]
RETURN ALL
Именно так сделано в numpy
🔸Аналог для pass
Сравните две записи
def some_func():
pass
def some_func():
...
По-моему, вторая запись более ясно говорит, что здесь что-то имеется в виду и это надо дописать 😉.
Но, несмотря на то, что Ellipsis был доступен еще с древних версий 2.Х, такая запись сработает только в Python3. Для 2го троеточие доступно только в квадратных скобках.
🔸Заглушка для значений по умолчанию
def func(x=...):
...
Альтернатива None? Совсем уж сомнительно 😖, но работает как визуальный триггер для разработчика)
Всё, больше идей пока нет)
На последок вот такая странная фиговина. Что покажет этот print() ???
#tricks