Содржина на објавата
Посмотрите на эту функцию 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