当我使用
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
向
__setitem__
添加类型提示,如此处所述
def __setitem__(self, key: str, value: SomeDictValueType) -> None:
super(SomeDict, self).__setitem__(key, value)
在类标题中使用
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]”
mypy 是正确的。由于您迭代
values()
,它无法判断 dict 值的类型是什么,它会将其视为 Any
。
我想,我刚刚想通了。我认为你不能从类型定义中继承子类(我一开始就尝试过一次,但又出现了另一个错误,而且看起来不够接近)。
在我看来,以下代码片段将是简约错误重现示例的解决方案。
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