Как я могу создать подсказку типа, что мой возвращаемый список содержит строки?

Я хочу использовать Type Hints в своей программе на Python. Как я могу создать подсказки типа для сложных структур данных, таких как

  • списки со строками
  • генератор, возвращающий целые числа?

Пример

def names() -> list:
    # I would like to specify that the list contains strings?
    return ['Amelie', 'John', 'Carmen']

def numbers():
    # Which type should I specify for `numbers()`?
    for num in range(100):
        yield num    

person Jon    schedule 23.05.2016    source источник


Ответы (1)


Используйте typing модуль; он содержит универсальные объекты типа, которые можно использовать для указания контейнеров с ограничениями на их содержимое:

import typing

def names() -> typing.List[str]:  # list object with strings
    return ['Amelie', 'John', 'Carmen']

def numbers() -> typing.Iterator[int]:  # iterator yielding integers
    for num in range(100):
        yield num

В зависимости от того, как вы разрабатываете свой код и как вы хотите использовать возвращаемое значение names(), вы также можете использовать types.Sequence и types.MutableSequence здесь, в зависимости от того, ожидайте, что сможете изменить результат.

Генератор — это особый тип итератора, поэтому здесь подходит typing.Iterator. Если ваш генератор также принимает значения send() и использует return для установки значения StopIteration, вы можете использовать объект typing.Generator тоже:

def filtered_numbers(filter) -> typing.Generator[int, int, float]:
    # contrived generator that filters numbers; returns percentage filtered.
    # first send a limit!
    matched = 0
    limit = yield
    yield  # one more yield to pause after sending
    for num in range(limit):
        if filter(num):
            yield num
            matched += 1
    return (matched / limit) * 100

Если вы новичок в подсказках типов, тогда PEP 483 — Theory of Type Hints< /a> может быть полезно.

person Martijn Pieters    schedule 23.05.2016