PyCharm中关于`generator.send(None)`

时间:2018-09-06 13:00:27

标签: python-3.x generics pycharm generator type-hinting

我正在尝试在当前项目中正确键入注释代码。这包括通过.send()接收值的生成器。在迭代之前,会向这些生成器发送None,以便能够进行到第一个yield.

据我了解,生成TYPE_A,接收TYPE_B并返回None的生成器的正确类型注解将是

Generator[TYPE_A, TYPE_B, None]

由于发送到生成器的第一个值可以是None,因此,我认为以下更合适。

Generator[TYPE_A, Optional[TYPE_B], NONE]

在PyCharm中,在最简单的情况下,它可以正常工作。

def f(g: Generator[str, Optional[int], None]):
    g.send(None)

仅当我将None替换为Optional[int]时,PyCharm才会将发送到生成器的int标记为类型矛盾。

到目前为止,太好了。但是,如果我用泛型来扩展这个想法,那么PyCharm就会变得困惑,或者我会。考虑以下情况。

(根据

Table = Dict[int, T]     # Table is generic
Messages = Table[bytes]  # Same as Dict[int, bytes]
我认为PEP483中this section

应该正确注释以下代码。这次将所有导入内容轻松复制和粘贴。)

from typing import TypeVar, Tuple, Generator, Optional

TYPE_A = TypeVar("TYPE_A")
TYPE_B = TypeVar("TYPE_B")
TUPLE_A = Tuple[TYPE_A, float]
GENERATOR_A = Generator[TUPLE_A, Optional[TYPE_B], None]
GENERATOR_B = Generator[TYPE_B, Optional[TUPLE_A], None]

def example_interactive(system_a: GENERATOR_A[int, str], system_b: GENERATOR_B[str, int]):
    system_b.send(None)
    system_a.send(None)

想法是TUPLE_A具有一种通用类型TYPE_A,而GENERATOR_AGENERATOR_B分别具有两个(一个立即类型变量和一个通过TUPLE_A中介的变量)。

type contradiction

很遗憾,PyCharm告诉我它不能那样工作。能否请您告诉我是否误解了某些内容或者类型注释是否未正确集成到PyCharm中?

0 个答案:

没有答案