为什么将枚举函数结果传递给 dict 构造函数会产生类型警告?
Why does passing an enumerate function result to the dict constructor yield a type warning?
考虑这两个 dict
声明:
some_data = [4, 5, 6]
d1 = dict(enumerate(some_data))
d2 = dict((x, y) for x, y in enumerate(some_data))
enumerate()
的 return 值是一个 enumerate object
,我理解它就像一个生成器(如果它实际上不是一个实际的生成器)产生的元组int
以及传递给 enumerate()
的可迭代元素的类型是什么。
所以,d1
和 d2
将在上面的代码之后得到相同的值,我会说 d2
声明不必要地设置另一个生成器,从中提取数据enumerate()
函数结果并在不修改的情况下产生它。
但是,像 PyCharm 这样的 IDE 会对 d1
的声明生成警告:
"Unexpected type(s): (enumerate[int]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Inspection info: This inspection detects type errors in function call expressions. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Types of function parameters can be specified in docstrings or in Python 3 function annotations."
这是为什么?这是对 enumerate()
定义的疏忽,它实际上是某种 Iterable[Tuple[Any, Any]]
吗?毕竟它会产生 [int, Any]
的元组,并且它与调用生成器创建的元组一样可迭代?
或者我是否遗漏了一些可能的构造,其中 enumerate()
的结果无法由 dict((Iterable))
构造函数处理?
这是一个已知错误,请为https://youtrack.jetbrains.com/issue/PY-35037投票(在标题附近竖起大拇指)
考虑这两个 dict
声明:
some_data = [4, 5, 6]
d1 = dict(enumerate(some_data))
d2 = dict((x, y) for x, y in enumerate(some_data))
enumerate()
的 return 值是一个 enumerate object
,我理解它就像一个生成器(如果它实际上不是一个实际的生成器)产生的元组int
以及传递给 enumerate()
的可迭代元素的类型是什么。
所以,d1
和 d2
将在上面的代码之后得到相同的值,我会说 d2
声明不必要地设置另一个生成器,从中提取数据enumerate()
函数结果并在不修改的情况下产生它。
但是,像 PyCharm 这样的 IDE 会对 d1
的声明生成警告:
"Unexpected type(s): (enumerate[int]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Inspection info: This inspection detects type errors in function call expressions. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Types of function parameters can be specified in docstrings or in Python 3 function annotations."
这是为什么?这是对 enumerate()
定义的疏忽,它实际上是某种 Iterable[Tuple[Any, Any]]
吗?毕竟它会产生 [int, Any]
的元组,并且它与调用生成器创建的元组一样可迭代?
或者我是否遗漏了一些可能的构造,其中 enumerate()
的结果无法由 dict((Iterable))
构造函数处理?
这是一个已知错误,请为https://youtrack.jetbrains.com/issue/PY-35037投票(在标题附近竖起大拇指)