【问题标题】:Invalid index type "Union[int, str]" for "Union[List[Any], Dict[Any, Any]]"; expected type "int"“Union[List[Any], Dict[Any, Any]]”的索引类型“Union[int, str]”无效;预期类型“int”
【发布时间】:2020-08-29 07:39:32
【问题描述】:

我最近和 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]

对于我尝试访问 my_list 中的值的行,Mypy 给了我以下错误:

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

【问题讨论】:

    标签: python list key type-hinting mypy


    【解决方案1】:

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

    • my_listlist。这满足Union[list, dict] 类型。
    • keystr。这满足Union[int, str] 类型。

    但是,my_list[key] 是错误的,因为您不能用字符串索引列表。在处理Union 类型时,mypy 将检查代码是否适用于Unions 中的每个类型组合,如果任何组合失败,则会抛出错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-21
      • 2021-10-15
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2021-06-14
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多