Что делает объект Python Ellipsis?
В то время как бездельничая серфинг в пространстве имен, я заметил нечетный объект с названием " Эллипсис", он, похоже, не является чем-то особенным, но обладает глобально доступным встроенным.
После поиска я обнаружил, что он используется в некотором неясном варианте синтаксиса разрезания Numpy и Scipy... но почти ничего.
Был ли этот объект добавлен к языку специально для поддержки 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
Ответы
Ответ 1
Это возникло в другой вопрос недавно. Я уточню мой ответ оттуда:
Многоточие - это объект, который может появляться в обозначениях срезов. Например:
myList[1:2, ..., 0]
Его интерпретация является чисто до любой реализует __getitem__
функцию и видит Ellipsis
объекты, но его основной (и предназначен) использование в числовом питона расширение, которое добавляет многомерный тип массива. Поскольку существует более одного измерения, нарезка становится более сложной, чем просто индекс начала и остановки; полезно также иметь возможность нарезать в нескольких измерениях. Например, для массива 4x4 верхняя левая область будет определяться срезом [:2,:2]
:
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
>>> a[:2,:2] # top left
array([[1, 2],
[5, 6]])
Расширяя это далее, Ellipsis используется здесь, чтобы указать заполнитель для остальных измерений массива, не указанных. Думайте об этом как об указании полного среза [:]
для всех измерений в зазоре, в котором он размещен, поэтому для трехмерного массива a[...,0]
совпадает a[:,:,0]
и для 4d, a[:,:,:,0]
, аналогично, a[0,...,0]
- a[0,:,:,0]
(хотя многие колоны в середине составляют полное число размеры в массиве).
Интересно, что в python3 литерал Ellipsis (...
) может использоваться вне синтаксиса слайса, поэтому вы можете написать:
>>> ...
Ellipsis
Кроме различных числовых типов, нет, я не думаю, что это используется. Насколько я знаю, он был добавлен исключительно для простого использования и не поддерживает ядро, кроме предоставления объекта и соответствующего синтаксиса. Объект, находящийся там, не требовал этого, но буквальная "..." поддержка срезов сделала.
Ответ 2
В Python 3 вы можете использовать литерал Ellipsis ...
как "nop" placeholder для кода:
def will_do_something():
...
Это не магия; любое выражение может использоваться вместо ...
, например:
def will_do_something():
1
(Нельзя использовать слово "санкционированный", но я могу сказать, что это использование было которое не было отвергнуто) Guido.)
Ответ 3
Вы также можете использовать Ellipsis при указании ожидаемого doctest:
class MyClass(object):
"""Example of a doctest Ellipsis
>>> thing = MyClass()
>>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'>
>>> type(thing) # doctest:+ELLIPSIS
<class '....MyClass'>
"""
pass
Ответ 4
Начиная с Python 3.5 и PEP484, буквальный эллипс используется для обозначения определенных типов для проверки статического типа при использовании typing.
Пример 1:
Однородные кортежи произвольной длины могут быть выражены с использованием одного типа и многоточия, например Tuple[int, ...]
Пример 2:
Можно объявить возвращаемый тип вызываемого без указания сигнатуры вызова, заменив литеральный многоточие (три точки) для списка аргументов:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
Ответ 5
Из Документация по Python:
Этот объект используется расширенным срезом (см. Python Reference Руководство). Он не поддерживает никаких специальных операции. Существует ровно один эллипсовый объект, названный Ellipsis
(a встроенное имя).
Ответ 6
Подводя итог тому, что говорили другие, с Python 3, Ellipsis по существу является еще одной константой синглтона, подобной None
, но без какого-либо конкретного использования. Существующие виды использования включают:
- В синтаксисе среза для представления полного фрагмента в остальных измерениях
- В типе намекает указать только часть типа (
Callable[..., int]
или Tuple[str,...]
) - В типах файлов-заглушек указывается значение по умолчанию без указания его
Возможное использование может включать:
- В качестве значения по умолчанию для мест, где
None
является допустимым параметром - Как контент для функции, которую вы еще не реализовали
Ответ 7
Вы можете использовать Ellipsis самостоятельно, в пользовательских ситуациях среза, таких как numpy, но он не имеет использования ни в одном встроенном классе.
Я не знаю, добавлено ли оно специально для использования в numpy, но я, конечно, не видел, чтобы он использовался где-то в другом месте.
См. также: Как использовать синтаксис разрезания многоточия в Python?
Ответ 8
__getitem__
minimal ...
пример в пользовательском классе
Когда магический синтаксис ...
переходит в руки []
в пользовательском классе, __getitem__()
получает Ellipsis
объект класса.
Затем класс может делать все, что захочет, с этим объектом Singleton.
Пример:
class C(object):
def __getitem__(self, k):
return k
# Single argument is passed directly.
assert C()[0] == 0
# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)
# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)
# Ellipsis notation generates the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with 'is'.
assert C()[...] is Ellipsis
# Everything mixed up.
assert C()[1, 2:3:4, ..., 6] == (1, slice(2,3,4), Ellipsis, 6)
Класс встроенного list
Python выбирает, чтобы дать ему семантику диапазона, и любое разумное использование этого также, конечно, должно.
Лично я бы просто избегал этого в своих API и вместо этого создал бы отдельный, более явный метод.
Протестировано в Python 3.5.2 и 2.7.12.
Ответ 9
Его предполагаемое использование должно быть не только для этих сторонних модулей. Он не упоминается должным образом в документации Python (или, может быть, я просто не мог этого найти), но эллипсис ...
фактически используется в CPython по крайней мере в одном месте.
Он используется для представления бесконечных структур данных в Python. Я столкнулся с этой нотой, играя со списками.
Подробнее см. этот вопрос.
Ответ 10
Как уже упоминалось @noɥʇʎԀʎzɐɹƆ и @phoenix - вы действительно можете использовать его в файлах-заглушках. например
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
Дополнительную информацию и примеры использования этого многоточия можно найти здесь https://www.python.org/dev/peps/pep-0484/#stub-files.
Ответ 11
@Matthew D. Scholefield: просто короткое замечание похоже на то, что синтаксис нарезки многоточия ограничен только массивами/матрицами, а не встроенным списком Python.
Ответ 12
Это эквивалентно.
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]
...
это константа, определенная внутри built-in constants
.
эллипсис
Так же, как и многоточие буквально "...". Специальное значение используется в основном в сочетании с расширенным синтаксисом секционирования для пользовательских типов данных контейнера.