如何在自定义 dict 子类中输入提示 .values() 的返回类型?

问题描述 投票:0回答:2

当我使用

mypy
检查以下类时,它会抛出错误

错误:从声明返回“Optional[SomeDictValueType]”的函数返回任何

get_by_id
中,因为
.values()
的类型未正确定义/限制。

class SomeDict(dict):
    def __init__(self) -> None:
        self._some_attribute: SomeRandomType = None

    def get_by_id(self, id: str) -> Optional[SomeDictValueType]:
        for p in self.values():
            if p._id == id:
                return p
        return None

我在网上发现了类似的问题并尝试了以下方法:
  1. __setitem__
    添加类型提示,如此处

    所述
     def __setitem__(self, key: str, value: SomeDictValueType) -> None:
         super(SomeDict, self).__setitem__(key, value)
    
  2. 在类标题中使用

    Mapping
    ,如此处

    所述
     class SomeDict(dict, Mapping[str, SomeDictValueType]): ...
    

如何在不使用

# type: ignore
的情况下消除此错误?此类的实例永远不会保存
SomeDictValueType
以外的类型的值。


编辑:
这是一个重现错误的简单示例。将以下代码片段保存到 python 文件并对其执行

mypy --strict <filename>.py

from typing import Optional

class SomeDict(dict):  # type: ignore
    def __init__(self) -> None:
        self._some_attribute: Optional[str] = None

    def get_by_id(self, id: str) -> Optional[int]:
        for p in self.values():
            if p._id == id:
                return p
        return None

应该抛出以下错误:

test.py:10:错误:从声明返回的函数返回任何内容 “可选[int]”

python python-typing mypy
2个回答
1
投票

mypy 是正确的。由于您迭代

values()
,它无法判断 dict 值的类型是什么,它会将其视为
Any


1
投票

我想,我刚刚想通了。我认为你不能从类型定义中继承子类(我一开始就尝试过一次,但又出现了另一个错误,而且看起来不够接近)。
在我看来,以下代码片段将是简约错误重现示例的解决方案。

from typing import Optional, Dict

class SomeDict(Dict[str, int]):
    def __init__(self) -> None:
        self._some_attribute: Optional[str] = None

    def get_by_id(self, id: str) -> Optional[int]:
        for p in self.values():
            if p == 5:
                return p
        return None
© www.soinside.com 2019 - 2024. All rights reserved.