Что означают параметры второго и третьего типов для типирования. Генератор? - PullRequest
0 голосов
/ 05 ноября 2018

Написание следующего кода

def a(n: int):
    for i in range(n):
        yield i

b = a(3)

затем просит PyCharm добавить подсказку типа к переменной b превращает объявление переменной в

b: Generator[int, Any, None] = a(3)

Что обозначают Any и None? Почему Generator принимает эти параметры типа?

1 Ответ

0 голосов
/ 05 ноября 2018

Параметры второго и третьего типа представляют тип, который принимает генератор send, и тип, который возвращает генератор.

send - это функция, представленная еще в Python 2.5 как часть PEP 342 , которая расширила генераторы для работы в качестве сопрограмм. В PEP 342 yield становится выражением, а send похоже на next, но указывает значение для выражения yield, при котором генератор приостанавливается. (Если генератор приостановлен в начале, а не на yield, в него нельзя отправить значение, отличное от None.) Посмотрите на пример в typing.Generator документах :

def echo_round() -> Generator[int, float, str]:
    sent = yield 0
    while sent >= 0:
        sent = yield round(sent)
    return 'Done'

этот генератор принимает значения с плавающей точкой в ​​send и возвращает округленное значение аргумента send.

Возвращаемые значения генератора были введены в Python 3.3 как часть PEP 380 , как часть поддержки делегирования субгенератора. До PEP 380 было очень неудобно разделять генератор на несколько функций, частично потому, что у субгенераторов не было механизма, подобного return, для передачи результатов обратно вызывающей стороне. С помощью PEP 380 генератор может return значение, которое будет использоваться как значение выражения yield from, которое выводится из генератора. В примере документации typing.Generator, echo_round возвращает строку.

...