Что делает объект с многоточием Python?
во время праздного серфинга в пространстве имен я заметил странный объект под названием "многоточием", это не кажется или делать что-то особенное, но это глобально доступный встроенный.
после поиска я обнаружил, что он используется в каком-то неясном варианте синтаксиса нарезки Numpy и Scipy... но больше почти ничего.
был ли этот объект добавлен в язык специально для поддержки Numpy + Scipy? Имеет ли многоточие какое-либо общее значение или использование все?
D:workspacenumpy>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
10 ответов:
это произошло в другой вопрос недавно. Я подробно расскажу о своем ответ оттуда:
многоточием - это объект, который может отображаться в нотации среза. Например:
myList[1:2, ..., 0]его интерпретация чисто до того, что реализует и видит
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]])расширяя это дальше, здесь используется многоточие, чтобы указать заполнитель для остальных размеров массива, не указанных. Думайте об этом, как указывая на полный срез
[:]для всех измерений в зазор он помещается, так что для 3d массива,a[...,0]это то же самое, чтоa[:,:,0]и для 4d,a[:,:,:,0]точно так же,a[0,...,0]иa[0,:,:,0](С тем, сколько двоеточий в середине составляют полное число измерений в массиве).интересно, что в python3 литерал с многоточием (
...) можно использовать вне синтаксиса среза, так что вы можете написать:>>> ... Ellipsisкроме различных числовых типов, нет, я не думаю, что он используется. Насколько мне известно, он был добавлен чисто для использования numpy и не имеет основной поддержки, кроме предоставления объекта и соответствующего синтаксиса. Объект, находящийся там, не требовал этого, но буквальный "..."поддержка ломтиков сделала.
в Python 3 можно использовать литерал с многоточием
...в качестве заполнителя " nop " для кода:def will_do_something(): ...это не магия; любое выражение может быть использовано вместо
..., например:def will_do_something(): 1(не могу использовать слово "санкции", но я могу сказать, что это использование было не откровенно отвергнут Гвидо.)
вы также можете использовать многоточие при указании ожидаемого 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
начиная с Python 3.5 и PEP484, буквальный многоточие используется для обозначения определенных типов для статического типа проверки при использовании введя модуль.
Пример 1:
однородные кортежи произвольной длины могут быть выражены с помощью одного типа и Многоточия, например
Tuple[int, ...]Пример 2:
можно объявить возвращаемый тип вызываемого объекта без указания вызова подпись путем замены литерального многоточия (три точки) для списка аргументов:
def partial(func: Callable[..., str], *args) -> Callable[..., str]: # Body
этот объект используется слайс обозначения (см. Ссылка На Python Руководство). Он не поддерживает никаких специальных оперативный. Есть ровно один объект многоточие, под названием
Ellipsis(a встроенное имя).
вы можете использовать многоточие самостоятельно, в пользовательских ситуациях нарезки, таких как numpy, но он не используется ни в одном встроенном классе.
Я не знаю, был ли он добавлен специально для использования в numpy, но я, конечно, не видел его в другом месте.
Читайте также: как вы используете синтаксис многоточия нарезки в Python?
__getitem__минимальный...пример в пользовательском классе
...служит в качестве магического значения одноэлементного класса, которое передается в__getitem__когда вы используете "волшебный вид"...синтаксис.класс может делать с ним все, что захочет.
пример:
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класс выбирает, чтобы дать ему семантику диапазона, и любое разумное использование его должно тоже курс.лично я бы просто держался подальше от него в своих API и вместо этого создал отдельный, более явный метод.
суммируя то, что другие сказали, начиная с Python 3, многоточие по существу является еще одной одноэлементной константой, подобной
None, но без определенного целевого использования. Существующие виды использования включают в себя:
- в синтаксисе среза для представления полного среза в остальных измерениях
- в типе намекая указать только часть типа (
Callable[..., int]илиTuple[str, ...])- в типе заглушки файлов, чтобы указать, что есть значение по умолчанию без указания это
возможные применения могут включать:
- как значение по умолчанию для мест, где
Noneявляется допустимым параметром- как содержание для функции, которую вы еще не реализовали
его предполагаемое использование не должно быть только для этих сторонних модулей. Это не сказано в документации Python (или, может быть, я просто не мог найти), но многоточием
...фактически используется в CPython по крайней мере в одном месте.используется для представления бесконечных структур данных в Python. Я наткнулся на эту нотацию, играя со списками.
посмотреть этот вопрос для получения дополнительной информации.
Как упоминалось @no .zɐɹɔ и @Phoenix - вы действительно можете использовать его в стаб-файлах. например,
class Foo: bar: Any = ... def __init__(self, name: str=...) -> None: ...дополнительную информацию и примеры использования этого многоточия можно найти здесь https://www.python.org/dev/peps/pep-0484/#stub-files
Comments