Python typehints:Union[int,List[int]]不支持索引赋值的目标

2024-10-03 17:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

myunionA可以是整数整数列表。 我如何编写打字提示来反映这一点?在

它尝试了以下代码并使用mypy进行了测试。最后一行失败-请参阅错误文本。在


numbers: List[int]
myunionA: Union[int, List[int]]
myunionB: Union[int, List[int]]

numbers = [11, 22]
numbers[2] = 3
myunionA = 2
myunionB[2] = 22 # ERROR(mypy): Unsupported target for indexed assignment

如何编写一个typehint来分配一个整数或一个整数列表?在


Tags: 代码文本列表错误请参阅整数errorlist
2条回答

类型注释在运行时具有效果。仅仅因为您已经指出myUnionB应该是int或者是{}的列表,您实际上从未将其定义为一个列表,更不用说包含至少3个元素的列表,这样您就可以将其分配给myunionB[2]。在

错误消息可能更清楚;myunionB是不受支持的目标,因为该名称尚不存在。变量注释不会“创建”一个变量,因为它不会给被注释的名称赋值(甚至是一个隐式的None)。在

正如deceze在评论中所说的,你的代码确实是不健全的。如果有人要做下面的事呢?在

# Legal, since myunionB can be *either* int or List[int]
myunionB: Union[int, List[int]] = 99

# Boom! At runtime, we get a "int is not subscriptable" error
myunionB[2] = 22

如果您想让mypy理解您的union当前正好是一个列表,那么您需要通过执行isinstance检查或类似操作来缩小变量的类型。在

^{pr2}$

或者更好的方法是重新设计代码,这样就不需要联合开始,只需要一个List[int]。在大多数情况下,尽量减少联合类型的使用是一个好主意,经常这样做(尽管不总是!)最终使您的代码更简单、更易于理解。在

相关问题 更多 >