В то время как я бездельничал в пространстве имен, я заметил странно выглядящий объект под названием Ellipsis
, он, кажется, не делает или делает что-то особенное, но это глобально доступный встроенный объект.
После поиска я обнаружил, что он используется в каком-то непонятном варианте синтаксиса нарезки Нампи и Сципи ... но почти ничего больше.
Был ли этот объект добавлен в язык специально для поддержки Numpy + Scipy? Ellipsis имеет какое-либо общее значение или использование вообще?
D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis
x=[];x.append(x);print(x)
, чтобы посмотреть, как он обрабатывает строковые циклические объекты. Вернулся[[...]]
. Я подумал: «Интересно, что произойдет, если я[[...]]
[[Ellipsis]]
...
в рекурсивном repr это просто заполнитель и не имеет никакого отношения кEllipsis
Ответы:
Это возникло в другой вопрос недавно. Я уточню мой ответ оттуда:
Многоточие - это объект, который может появляться в обозначениях срезов. Например:
Его интерпретация является чисто до любого Реализует
__getitem__
функцию и видитEllipsis
объекты, но его основное (и предназначено) использование в Numpy библиотеки третьей стороны, которая добавляет многомерный массив типа. Поскольку существует более одного измерения, нарезка становится более сложной, чем просто индекс начала и остановки; полезно также иметь возможность разрезать по нескольким измерениям. Например, с учетом массива 4x4 верхняя левая область будет определяться срезом[:2,:2]
:Расширяя это далее, Ellipsis используется здесь, чтобы указать местозаполнитель для остальных размеров массива, не указанных. Думайте об этом как об указании полного среза
[:]
для всех размеров в зазоре, который он поместил, поэтому для трехмерного массиваa[...,0]
то же самое, чтоa[:,:,0]
и для 4da[:,:,:,0]
, аналогично,a[0,...,0]
естьa[0,:,:,0]
(хотя все колоны в середине составляют полное число размеров в массиве).Интересно, что в python3 литерал Ellipsis (
...
) используется вне синтаксиса слайса, поэтому вы можете написать:Кроме различных числовых типов, нет, я не думаю, что это используется. Насколько я знаю, он был добавлен исключительно для простого использования и не имеет поддержки ядра, кроме предоставления объекта и соответствующего синтаксиса. Объект, находящийся там, не требовал этого, но буквальная «...» поддержка срезов сделала.
источник
typing
модуле стандартной библиотеки : например,Callable[..., int]
для указания вызываемого объекта, который возвращаетint
без указания сигнатуры, илиTuple[str, ...]
для обозначения однородного набора строк переменной длины.a = [1, 2]; a[0] = a; print(a)
дает[[...], 2]
. Это то же самое или другое использование?В Python 3 вы можете использовать литерал Ellipsis
...
в качестве заполнителя «nop» для кода:Это не магия; любое выражение может быть использовано вместо
...
, например:(Не могу использовать слово «санкционировано», но я могу сказать, что это использование не было прямо отвергнуто Гвидо.)
источник
...
когда люди хотят указать что-то, что они намереваются заполнить позже (пустой блок «todo») иpass
что означает блок, не имеющий кода.NotImplemented
литерал, который полезен, когда вы хотите, чтобы ваша неполная функция возвращала что-то значимое (а неNone
как в вашем примере). (Другой вариант использования: реализация арифметических операций )NotImplemented = 'something_else'
, допустим Python, но... = 'something_else'
это синтаксическая ошибка.NotImplemented
не является альтернативойNone
. Его использование довольно узкое. См. Документацию здесьНачиная с Python 3.5 и PEP484 , буквенный многоточие используется для обозначения определенных типов при проверке статического типа при использовании модуля ввода .
Пример 1:
Пример 2:
источник
Вы также можете использовать многоточие при указании ожидаемого вывода doctest :
источник
...
являются синтаксическими, а неuse
фактическим объектом Ellipsis. Не правда ли, не более чем удобное название для адаптируемой концепции?Из документации Python :
источник
Подводя итог тому, что говорили другие, начиная с Python 3, Ellipsis, по сути, является еще одной одноэлементной константой, аналогичной
None
, но без конкретного предполагаемого использования. Существующее использование включает в себя:Callable[..., int]
илиTuple[str, ...]
)Возможное использование может включать:
None
допустимая опцияисточник
__getitem__
минимальный...
пример в пользовательском классеКогда магический синтаксис
...
передается[]
в пользовательский класс,__getitem__()
получаетEllipsis
объект класса.Затем класс может делать все, что захочет, с этим объектом Singleton.
Пример:
Встроенный
list
класс Python выбирает, чтобы дать ему семантику диапазона, и любое разумное использование этого также, конечно, должно.Лично я бы просто избегал этого в своих API и вместо этого создал бы отдельный, более явный метод.
Протестировано в Python 3.5.2 и 2.7.12.
источник
Вы можете использовать Ellipsis самостоятельно, в пользовательских ситуациях нарезки, как это делал numpy, но он не используется ни в одном встроенном классе.
Я не знаю, был ли он добавлен специально для использования в numpy, но я, конечно, не видел его где-либо еще.
Смотрите также: Как вы используете синтаксис нарезки многоточия в Python?
источник
Как уже упоминалось @ noɥʇʎԀʎzɐɹƆ и @phoenix - вы действительно можете использовать его в файлах-заглушках. например
Дополнительную информацию и примеры использования этого многоточия можно найти здесь https://www.python.org/dev/peps/pep-0484/#stub-files.
источник
Его предполагаемое использование не должно быть только для этих сторонних модулей. Он не упоминается должным образом в документации по Python (или, может быть, я просто не смог этого найти), но многоточие
...
фактически используется в CPython по крайней мере в одном месте.Он используется для представления бесконечных структур данных в Python. Я наткнулся на это обозначение во время игры со списками.
Смотрите этот вопрос для получения дополнительной информации.
источник
ellipsis
встроенного типа иEllipsis
объекта. Представление бесконечных структур данных с помощью эллипсов предназначено исключительно для отображения, не имеющего ничего общего сellipsis
типом илиEllipsis
объектом.__repr__
строки Python стремятся быть действительными выражениями Python - если бы это не было для многоточия, существующего в языке, как оно есть, представление не было бы допустимым выражением.eval(repr(a))
стремиться быть равнымa
. К сожалению, на практике это время от времени ложно, даже для встроенных типов. Попробуйте это:a=[]; a.append(a); eval(repr(a))
.repr(a)
является[[...]]
недопустимым выражением в Python 2. (В Python 3 оно допустимо, но результатом eval является нечто иное, все еще противоречащее первоначальному замыслу.)Это эквивалентно.
...
константа, определенная внутриbuilt-in constants
.источник