Python Glossary English

Python 3.11+Аннотации и typingконструкция

Распаковка * в индексе

синтаксис

a[*b] разворачивает b в кортеж индексов: a[*b] — то же, что a[tuple(b)]. Главное применение — tuple[int, *Ts] в аннотациях (Python 3.11+).

Синтаксис

объект[*итерируемое]
объект[x, *итерируемое]

Главная ловушка: __getitem__ всегда получает кортеж — даже a[*[5]] передаёт (5,), а не 5, поэтому список так индексировать нельзя: lst[*idx] даёт TypeError. Конструкция нужна для многомерных объектов и обобщённых типов с TypeVarTuple, а не для обычных последовательностей. До 3.11 та же запись — SyntaxError.

Примеры

# Python 3.11+
class Show:
    def __getitem__(self, key):
        return key
s = Show()
idx = (1, 2)
print(s[*idx])  # → (1, 2)
print(s[0, *idx])  # → (0, 1, 2)
print(s[*[5]])  # → (5,)
# Python 3.11+
print(tuple[int, *tuple[str, ...]])  # → tuple[int, *tuple[str, ...]]
lst = [10, 20, 30]
idx = [1]
print(lst[*idx])  # → TypeError

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности