Підписки

Оновлено: 24.04.2023

Підписка екземпляра класу контейнера зазвичай вибирає елемент із контейнера. Підписка загального класу зазвичай повертатиме об’єкт GenericAlias.

subscription ::=  primary "[" expression_list "]"

Коли об’єкт має індекс, інтерпретатор обчислить основний і список виразів.

Основний має обчислювати об’єкт, який підтримує підписку. Об’єкт може підтримувати підписку через визначення одного або обох __getitem__() і __class_getitem__(). Коли основний має індекс, обчислений результат списку виразів буде передано одному з цих методів. Щоб дізнатися більше про те, коли __class_getitem__ викликається замість __getitem__, перегляньте __class_getitem__ проти __getitem__.

Якщо список виразів містить принаймні одну кому, він обчислиться як tuple, що містить елементи списку виразів. В іншому випадку список виразів обчислюватиметься значенням єдиного члена списку.

Для вбудованих об’єктів є два типи об’єктів, які підтримують підписку через __getitem__():

Відображення. Якщо основним є mapping, список виразів має обчислювати об’єкт, значення якого є одним із ключів відображення, а підписка вибирає значення у відображенні, яке відповідає цьому ключу. Прикладом вбудованого класу відображення є клас dict. Послідовності. Якщо основним є sequence, список виразів має обчислюватися як int або slice (як описано в наступному розділі). Приклади вбудованих класів послідовності включають класи str, list і tuple.

Формальний синтаксис не містить спеціальних положень щодо від’ємних індексів у послідовностях. Однак усі вбудовані послідовності забезпечують метод __getitem__(), який інтерпретує негативні індекси, додаючи довжину послідовності до індексу, щоб, наприклад, x[-1] вибирати останній елемент x. Отримане значення має бути невід’ємним цілим числом, меншим за кількість елементів у послідовності, і підписка вибирає елемент, індекс якого є цим значенням (відлік від нуля). Оскільки підтримка негативних індексів і нарізки відбувається в методі __getitem__() об’єкта, підкласи, які замінюють цей метод, повинні будуть явно додати цю підтримку.

string — це особливий вид послідовності, елементами якої є символи. Символ — це не окремий тип даних, а рядок із рівно одного символу.