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

2024-10-01 17:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

当我用mypy检查下面的类时,它会抛出一个错误

error: Returning Any from function declared to return "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. here所述,向__setitem__添加类型提示

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

     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: error: Returning Any from function declared to return "Optional[int]"


Tags: fromselfnoneid类型getbyreturn
2条回答

我想,我刚刚明白了。我认为您无法从键入定义中创建子类(我在开始时尝试过一次,但又出现了另一个错误,并且没有仔细查看)。
在我看来,下面的代码片段将是最小错误再现示例的解决方案

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

mypy是正确的。因为您遍历了^ {< CD1> },所以无法判断DICT值的类型,它认为它是^ {CD2}}。

相关问题 更多 >

    热门问题