为啥此代码会生成类型注释警告?

Posted

技术标签:

【中文标题】为啥此代码会生成类型注释警告?【英文标题】:Why does this code generate a Type Annotation Warning?为什么此代码会生成类型注释警告? 【发布时间】:2021-06-13 03:35:05 【问题描述】:

我有带有这些类型注释的 python 函数

def func_1() -> Optional[Sequence[str, List[str], str]]:
    # do stuff

def func_2(a: str, b: List[str], c: str) -> None:
    # do other stuff

为什么下面的代码在我调用 func_2 的那一行给出警告“Expected type list[str, Any]' got 'str' instead”?

result = func_1()
func_2(result[0], result[1], result[2])

这是否意味着我的类型检查器有问题,或者我的代码有问题?

【问题讨论】:

我得到的错误远不止这些,包括 syntax 错误。请仔细检查这是minimal reproducible example。 This: List[str, ...] 不是一个有效的注释,据我所知......与Sequence[str, List[str, ...] str] 相同......你想在那里表达什么? 请逐字发布警告并提供result 的值。 result[1] 很可能是 str 而不是 list,但从您提供的内容中不确定。 提供代码只是为了显示我使用的两种类型注释。当然缺少函数实现和导入,但是如果 func_1 保证返回带注释的类型(因为该注释没有给出警告),那么 result[1] 怎么可能是字符串而不是 List[str, 。 ..]?根据 PEP 484 List[str, ...] 是用于长度不确定的字符串列表的注释。我确实提供了 PyCharm 给出的警告。这不是关于特定执行的问题,而是关于类型警告的问题,因此结果没有值。 @J.Grohmann 没有。这是不正确的。 SequenceList 一样,采用单个类型变量。 【参考方案1】:

Sequence 不适合与这样的多种类型一起使用。 SequenceList 并不意味着具有结构(意思是,元素 1 始终为 int,元素 2 始终为 str,并且长度始终为 2)。

您应该改用Tuple

另见:https://***.com/a/40181387/4597523

【讨论】:

以上是关于为啥此代码会生成类型注释警告?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 php 7 中添加回调类型提示会触发弃用警告

为啥警告框中会出现“阻止此页面创建其他对话框”?

为啥 pandas read_csv 会发出此警告? (元素比较失败)

为啥这个 type_traits 代码会给我一个整数到指针转换警告?

为啥 iOS 会显示警告“此应用程序需要由开发人员更新才能在此版本的 iOS 上运行”。对于我的反应原生应用程序?

为啥 C++/CLI 编译器不为过时的属性调用生成警告?