【发布时间】:2019-02-05 06:10:53
【问题描述】:
我正在使用作为协同程序的生成器,正如 David Beazley(http://www.dabeaz.com/coroutines/)的精彩演讲中所描述的那样,我不知道如何键入装饰器 consumer。到目前为止,这是我所拥有的:
from typing import Any, Callable, Generator, Iterable
ArbGenerator = Generator[Any, Any, Any]
def consumer(fn: ❓) -> ❓:
@wraps(fn)
def start(*args: Any) -> ArbGenerator:
c = fn(*args)
c.send(None)
return c
return start
使用示例,有点删节:
@consumer
def identity(target: ArbGenerator) -> ArbGenerator:
while True:
item = yield
target.send(item)
@consumer
def logeach(label: Any, target: ArbGenerator) -> ArbGenerator:
while True:
item = yield
print(label, item)
target.send(item)
pipeline = identity(logeach("EXAMPLE", some_coroutine_sink()))
粗体 ❓ 标记我不确定的地方 - 我也不确定我定义的类型 ArbGenerator。 (问题是,如果没有(装饰器)函数consumer 本身键入,我不确定mypy 是否正在使用该装饰器分析任何生成器函数,这就是为什么我不确定ArbGenerator。)
我对最紧凑的类型感兴趣,比Any 更好,这样当我编写这些协程的链时,mypy 会在链设置不正确时给我很好的警告。
(如果重要,Python 3.5。)
【问题讨论】:
-
我倾向于将显式类型视为可选,这似乎是 Python 社区中最慷慨的类型应用。在这种情况下,对于(未来的)程序员来说,any 类型可能比单独使用鸭子类型更痛苦,所以我会省略它。
-
@AdamSmith - TBH 我认为那(省略显式输入)是 Python 的哲学 - 所以当我在我的新工作(我对 Python 相对较新)时,我有点惊讶,输入提示甚至存在并且我的同事正在大量使用它。
-
这对你来说是个好消息!我很想在这里看到一个好的解决方案,因为强显式类型和协程对我来说都是弱点,所以我屏住呼吸看着这个问题:)
-
@davidbak 你为什么不用
typing.Coroutine? -
@Kasrâmvd - 谢谢。出于某种原因,我认为
Coroutine特定于异步。
标签: python python-3.x generator type-hinting