gpt4 book ai didi

Python 类型提示 - 更好的 cast() 语法?

转载 作者:行者123 更新时间:2023-12-03 15:50:52 27 4
gpt4 key购买 nike

我最近开始使用 type hints在我的代码中,到目前为止发现它们(大部分)非常有用。

但是,我真正不喜欢的一件事是强制类型检查器假定变量属于某种类型的语法。鉴于这个例子:

import itertools
from typing import Iterable, Tuple
x: Iterable[Tuple[str, str]] = itertools.combinations('abc', 2)
# error: Incompatible types in assignment (expression has type "Iterable[Tuple[str, ...]]", variable has type "List[Tuple[str, str]]")

据我所知,解决此问题的推荐方法是明确 cast 强制类型检查器使用指定类型的对象,例如:
import itertools
from typing import Iterable, Tuple, cast
x = cast(Iterable[Tuple[str, str]], itertools.combinations('abc', 2))

我个人觉得这个解决方案有点恶心。我主要担心的是,对于没有经验的读者来说,不清楚 cast纯粹是为了帮助静态分析器。 (如果我还不知道,我会根据名称和上下文假设它正在转换并复制到指定类型的对象,而实际上没有运行时成本。)
cast看起来像任何旧的函数调用。当我看到对某个值调用了一个函数时,我希望该值发生变异和/或发生其他一些副作用,但在这种情况下,唯一的副作用是 mypy停止提示。类型提示本身具有独特的语法,但我觉得这使新类型语法和传统 Python 语法的混合使线条变得模糊。 (这已经有点模糊了,因为您必须 import 类型并可以组合它们,但这是另一个讨论。)
cast 是否有替代语法? - 类似的行为?我还没有找到任何东西,但我希望有类似的东西:
x1 = itertools.combinations('abc', 2)) # cast: Iterable[Tuple[str, str]] 

x2: Iterable[Tuple[str, str]] = itertools.combinations('abc', 2)) # type: cast

x3: Cast[Iterable[Tuple[str, str]]] = itertools.combinations('abc', 2))

最佳答案

实际上,最新版本的 Mypy 确实返回了正确的类型 Iterator[Tuple[str, str]] .
此更改在 PR https://github.com/python/typeshed/pull/4309 中引入 Typeshed .
如果您无法将 mypy 更新到最新版本,您可以从 typeshed check out 最新版本。并使用配置选项 custom_typeshed_dir .
https://mypy.readthedocs.io/en/stable/config_file.html#confval-custom_typeshed_dir更多细节。

关于Python 类型提示 - 更好的 cast() 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com