Надлежащая аннотация типа для объекта, который можно распаковать с помощью оператора *?

1

Какую аннотацию подходящего типа для объекта, который должен быть распакован оператором *, т.е. foo в этом (случайном) примере:

def some_function(foo):
    ... = bar(*foo)

Я знаю, что * может распаковать кортежи и списки, но ограничивается ли этими двумя классами или имеет какой-либо интерфейс, который бы мог использовать его для других коллекций?

  • 1
    Будет ли typing.Iterable Достаточно ли?
  • 0
    Нет, это будет означать, что даже строки не могут быть распакованы, но это вызывает ошибку SyntaxError.
Показать ещё 7 комментариев
Теги:
types
mypy

1 ответ

2

Python распаковывает любой итерацию (так list, str Инг, tuple, dict ionary и т.д.). Таким образом, вы можете использовать для этого Iterable, например:

from typing import Iterable

def some_function(foo : Iterable):
    bar(*foo)

Если элементы, которые распакованы, должны быть определенного типа, вы можете указать это между квадратными скобками, например:

# given the items that are unpacked should all be ints

from typing import Iterable

def some_function(foo : Iterable[int]):
    bar(*foo)
  • 1
    У меня есть вопрос сам. Есть ли веская причина для использования typing.Iterable поверх collections.abc.Iterable если вы не хотите указывать содержимое (например, Iterable[int] ) итерируемого?
  • 2
    @timgeb: хороший вопрос! Я думаю, что это не имеет никакого значения, но лично мне нравится typing больше, так как это предназначено для подписи типов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню