【问题标题】:Type annotation for glob generatorglob 生成器的类型注释
【发布时间】:2020-08-10 04:27:18
【问题描述】:

我的函数应该返回一个生成器,该生成器通过来自pathlib 模块的Path 生成特定签名的文件。问题是我不明白如何在 Python 3 中正确注释函数。

函数如下:

from pathlib import Path
from typing import Generator

def get_waves_generator(directory: str) -> ???:
    gen = Path(directory).rglob('*.wav')
    return gen

我找到了this answer,它本质上是文档的副本。我需要用以下注释它

Generator[YieldType, SendType, ReturnType]

就我而言,YieldTypeSendTypeReturnType 是什么?

【问题讨论】:

  • YieldType 可能是pathlib.PosixPath。如果生成器只产生值,则其他两种类型为无。见docs.python.org/3/library/typing.html#typing.Generator
  • 谢谢,它也与@fepegar 回答的内容非常匹配,尽管您对类型是正确的(它是pathlib.PosixPath,而不是Path)。您愿意提供这个作为答案吗?

标签: python python-3.x path generator


【解决方案1】:

来自the docs

一个生成器可以被泛型类型Generator[YieldType, SendType, ReturnType]注解。例如:

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

请注意,与类型模块中的许多其他泛型不同, SendType of Generator 的行为是逆变的,而不是协变的或 不变。

如果您的生成器只会产生值,请设置 SendTypeReturnType 无:

def infinite_stream(start: int) -> Generator[int, None, None]:
    while True:
        yield start
        start += 1

由于该生成器正在返回 pathlib.Path 的实例,您可以这样做

from pathlib import Path
from typing import Generator

def get_waves_generator(directory: str) -> Generator[Path, None, None]:
    gen = Path(directory).rglob('*.wav')
    return gen

【讨论】:

  • 谢谢!很接近,我猜 Eric 提到的一个错误是:类型是 pathlib.PosixPath。尽管如此,请投票,但我认为我不能接受目前的答案(仍在学习论坛的规则,所以如果有什么请纠正我)。编辑:除非我得到 15+ 分,否则我实际上无法投票...
  • PosixPath 不是 Unix 特有的吗?也看到这个问题:stackoverflow.com/questions/58647584/…
  • 我只能在 Linux 上测试它,因此我发表了评论。我认为你是对的。 PosixPath 继承自 Path。很抱歉造成混乱,我想你可以改回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2011-11-14
  • 2019-06-03
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多