У меня есть генератор, который не использует значения send(). Должен ли я ввести его send_value как Any или None?
import typing as t
def pi_generator() -> t.Generator[int, ???, None]:
pi = "3141592"
for digit in pi:
yield int(digit)
pi_gen = pi_generator()
next(pi_gen) # 3
pi_gen.send('foo') # 1
pi_gen.send(pi_gen) # 4
Причины, которые я вижу для Any:
send() для любого типа, поэтому, если у кого-то была причина использовать .send(1) с этим генератором, это совершенно нормально..send(x: Any) является более общим, чем .send(x: None).Причины, которые я вижу для None:
.send() для этого генератора, скорее всего, он неправильно понимает, что он делает, и подсказка типа должна проинформировать его об этом.





Цитирование документации для typing.Generator:
Если ваш генератор будет выдавать только значения, установите
SendTypeиReturnTypeнаNone:def infinite_stream(start: int) -> Generator[int, None, None]: while True: yield start start += 1
Установка SendType на None — это рекомендуемый способ сообщить, что генератор не ожидает от вызываемых абонентов значений send().
На самом деле этот фрагмент документации старше версии 3.11, где был введен Never (а NoReturn изначально не предполагалось, что он будет иметь значение вне функций с недостижимым концом, поэтому здесь не рассматривался), это может быть просто упущением. Сегодня вечером я открою заявку на документацию, чтобы получить дополнительную информацию.
У вас есть подсказки, почему бы и нет
typing.Never? Я бы сказал, что запретить вручную.send(None)лучше, чем разрешить, но в документации даже не предлагается такой альтернативы.