Как аннотировать типы множественных возвращаемых значений?
Как я могу использовать подсказки типа для аннотации функции, которая возвращает Iterable
, которая всегда дает два значения: a bool
и A str
? Подсказка Tuple[bool, str]
близка, за исключением того, что она ограничивает тип возвращаемого значения кортежем, а не генератором или другим типом итерации.
Мне в основном любопытно, потому что я хотел бы аннотировать функцию foo()
, которая используется для возврата нескольких значений, таких как:
always_a_bool, always_a_str = foo()
Обычно функции типа foo()
делают что-то вроде return a, b
(который возвращает кортеж), но я хотел бы подсказка типа должна быть достаточно гибкой, чтобы заменить возвращаемый кортеж генератором, списком или чем-то еще.
1 ответ:
Вы всегда возвращаете Один Объект; использование
return one, two
просто возвращает кортеж.Так что да,
-> Tuple[bool, str]
Совершенно верно.только Тип
Tuple
позволяет задатьфиксированное число элементов, каждый из которых имеет отдельный тип. Вы действительно должны возвращать кортеж, всегда, если ваша функция производит фиксированное число возвращаемых значений, особенно когда эти значения являются конкретными, различными типами.Ожидается, что другие типы последовательностей будут иметь одна спецификация типа для переменного числа элементов, поэтому
typing.Sequence
здесь не подходит. Также смотрите в чем разница между списками и кортежами?Кортежи-это гетерогенные структуры данных (то есть их записи имеют разные значения), а списки-однородные последовательности. Кортежи имеют структуру, списки-порядок.Система подсказок типа Python придерживается этой философии, в настоящее время нет синтаксиса, чтобы указать итерацию фиксированная длина и содержащая определенные типы в определенных положениях.
Если вы должны указать, что любая итерация будет выполняться, то лучшее, что вы можете сделать, это:
-> Iterable[Union[bool, str]]
В этот момент вызывающий может ожидать булевы и строки в любом порядке и неизвестной длины (где-то между 0 и бесконечностью).