【发布时间】:2020-09-30 23:42:42
【问题描述】:
考虑这两个dict 声明:
some_data = [4, 5, 6]
d1 = dict(enumerate(some_data))
d2 = dict((x, y) for x, y in enumerate(some_data))
enumerate() 的返回值是一个enumerate object,我理解它就像一个生成器(如果它实际上不是一个实际的生成器),它产生int 的元组以及任何类型的元素传递给enumerate() 的可迭代对象是。
所以,d1 和 d2 在上面的代码之后最终会得到相同的值,我想说d2 声明是不必要地设置另一个生成器,从 enumerate() 函数结果中提取数据并产生无需修改。
但是,像 PyCharm 这样的 IDE 会为 d1 的声明生成警告:
"意外类型:(enumerate[int]) 可能类型:(映射) (Iterable[Tuple[Any, Any]])
检查信息:此检查检测函数调用表达式中的类型错误。由于动态调度和鸭子类型,这在有限但有用的情况下是可能的。函数参数的类型可以在文档字符串或 Python 3 函数注释中指定。"
这是为什么?这是对enumerate() 定义的疏忽,实际上是Iterable[Tuple[Any, Any]] 之类的?毕竟它会产生[int, Any] 的元组,并且它与通过调用生成器创建的元组一样可迭代?
或者我错过了一些可能的构造,enumerate() 的结果无法由 dict((Iterable)) 构造函数处理?
【问题讨论】:
标签: python dictionary pycharm enumerate