切中要害,下面是将在PyCharm中引发错误的示例代码:
list1 = [0] * 5
list1[0] = ''
list2 = [0 for n in range(5)]
list2[0] = ''
然后,PyCharm在第2行和第4行都返回一个错误,如下所示:
Unexpected type(s):(int, str)Possible type(s):(SupportsIndex, int)(slice, Iterable[int])
运行代码不会导致任何错误,但当我编码时,PyCharm会不断地抛出上面的消息。我想知道为什么PyCharm会给出这个错误,我怎样才能用最干净的代码解决这个问题。谢谢。
编辑:抱歉,示例代码的第3行有一个拼写错误,已更正。(list2 = [0 for n in range(0)]
应为list2 = [0 for n in range(5)]
)
发布于 2021-11-09 12:51:05
在您的示例中,PyCharm看到您的第一行,并认为列表的类型是List[int]
。我的意思是它是一个整数列表。
您可能会知道您的列表不是整型的,并且可以通过以下方式接受任何值:
from typing import Any, List
list1: List[Any] = [0] * 5
list1[0] = ''
我使用键入模块只是为了解释这个想法。下面是一种简单的方式来声明list1只是一个包含所有内容的列表:
list1: list = [0] * 5
list1[0] = ''
还要考虑使用尽可能严格的类型化。它可能会帮助你防止bug。
如果您同时需要字符串和int,则使用以下命令:
from typing import List, Union
list1: List[Union[int, str]] = [0] * 5
# Starting from Python 3.10 you may use List[int|str] instead
发布于 2021-11-09 12:27:30
这只是来自代码检查工具的警告。
这基本上就是说,您创建了一个整数列表(包含5个等于0
的项),然后用一个字符串替换一个整数。
这在python中不会产生错误,因为它对数据类型非常灵活,如果需要,您可以生成具有不同数据类型的列表。
它只是警告您,如果您稍后在一些代码中使用该列表,而这些代码只需要整数,而不是找到一个字符串项目,则可能会出现问题。
您可以通过禁用检查或直接创建字符串列表来解决此问题。
list1 = [""] * 5
list2 = ["" for n in range(0)]
或者也可以
list1 = ["0"] * 5
list2 = ["0" for n in range(0)]
或者,只要记住列表可能包含不同的数据类型,就可以忽略该警告。
发布于 2021-11-09 12:52:22
正如其他人所说,这只是一个警告,告诉你要小心。
如果您想明确说明您的列表接受任意值,您可以提供适当的类型提示:
from typing import Any, List
list1: List[Any] = [0] * 5
list1[0] = ''
如果您打算放入整数或字符串,但列表中没有其他内容,您也可以从Python3.10开始执行list1: List[int|str] = [0] * 5
,或者在旧版本上使用笨重的typing.Union
。
https://stackoverflow.com/questions/69898015
复制相似问题