"Union[List[Any], Dict[Any, Any]]" 的索引类型"Union[int, str]"无效;预期的类型 "int"



我最近和mypy有一点争吵。假设我有一个变量,它可以是字典或列表(此处为self.my_list(。稍后,在一个函数(这里:get(中,我想访问此列表或字典中的值。

from typing import Union, Any
class my_class:
def __init__(self, whatever: Union[list, dict]):
self.my_list: Union[list, dict] = whatever
def get(self, key: Union[int, str]) -> Any:
return self.my_list[key]

Mypy 为我尝试访问my_list中的值的行提供了以下错误:

Invalid index type "Union[int, str]" for "Union[List[Any], Dict[Any, Any]]"; expected type "int"
  • 有人知道如何处理此错误吗?
  • 从一开始就有一个可以是字典或列表的变量可能是不好的吗?
mypy

在这个错误中没有错。考虑这种情况:

  • my_list是一个list.这满足Union[list, dict]类型。
  • key是一个str.这满足Union[int, str]类型。

但是,my_list[key]是错误的,因为您无法使用字符串为列表编制索引。在处理Union类型时,mypy将检查代码是否适用于Union秒内的每种类型组合,如果任何组合失败,则会抛出错误。

总的来说,我认为您当前的 API 没有显示出好的设计。my_list是一个内部属性,其类型是实现细节,不应影响类的使用。但是,您现在强制用户记住(或者更糟的是,动态检查(他们是否在类中存储了列表或字典,并且可能使用不同的键。对我来说,这要么是不必要的包装(将东西放在可以直接使用它们的类中(,要么是不正确的封装(该类公开了太多的实现细节或将其职责推给用户(。

相关内容

最新更新