栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python类型提示和上下文管理器

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python类型提示和上下文管理器

每当我不能百分百确定一个函数接受什么类型时,我都喜欢咨询typeshed,它是Python类型提示的规范存储库。例如,Mypy直接捆绑并使用typeshed帮助其执行类型检查。

我们可以在此处找到contextlib的存根:https
:
//github.com/python/typeshed/blob/master/stdlib/2and3/contextlib.pyi

if sys.version_info >= (3, 2):    class GeneratorContextManager(ContextManager[_T], Generic[_T]):        def __call__(self, func: Callable[..., _T]) -> Callable[..., _T]: ...    def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., GeneratorContextManager[_T]]: ...else:    def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...

这有点让人不知所措,但是我们关心的是这一行:

def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...

它声明装饰器接受一个

Callable[..., Iterator[_T]]
-具有任意参数的函数,该函数返回一些迭代器。因此,总之,这样做是可以的:

@contextlib.contextmanagerdef foo() -> Iterator[None]:    yield

那么,为什么

Generator[None, None, None]
如评论所建议的那样使用也能起作用?

这是因为

Generator
是的子类型
Iterator
-我们可以通过咨询typeshed再次自行检查这一点。因此,如果我们的函数返回一个生成器,它仍然与
contextmanager
预期的兼容,因此mypy可以毫无问题地接受它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625156.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号