Python如何为返回固定键字典的函数设置正确返回类型提示
你尝试的Dict['Room':float, 'CPU':float, 'hum':float]写法不符合Python类型标注规范,Dict泛型仅支持传入「键的统一类型」和「值的统一类型」两个参数,你写的冒号表达式会被识别为切片语法,因此会出现悬停显示Dict[slice, slice, slice]的问题。
该需求完全可以实现,推荐以下两种实现方案:
方案1:使用TypedDict(最优适配你的场景)
TypedDict是Python专门用来标注固定键、每个键对应值类型可单独指定的字典的类型工具,Python 3.8及以上版本内置在typing模块中,完全兼容普通字典的JSON序列化逻辑,不需要额外转换。
用法示例:
from typing import TypedDict # 先定义固定结构的字典类型 class TempInfo(TypedDict): Room: float CPU: float hum: float # 标注到函数返回值即可 def getTemps(self) -> TempInfo: """ get room and cpu temperature in °C as well as humidity in % """ # 向服务端发送温度请求 msg = {'type':'req', 'reqType':'temps'} self.send(msg) res = self.recieve() # 获取响应 return res
标注完成后VS Code可以准确识别返回字典的每个键名和对应值类型,写错键名、赋值类型不符都会有实时提示。
如果你的Python版本低于3.8,可安装typing_extensions包后,从typing_extensions导入TypedDict使用。
方案2:使用dataclass(适合偏好属性访问的场景)
如果你接受用属性访问代替字典键访问,也可以用dataclass实现,需要序列化时转成普通字典即可:
from dataclasses import dataclass, asdict import json @dataclass class TempInfo: Room: float CPU: float hum: float def getTemps(self) -> TempInfo: msg = {'type':'req', 'reqType':'temps'} self.send(msg) res = self.recieve() # 把接口返回的字典转为dataclass实例返回 return TempInfo(**res) # 需要JSON序列化时调用asdict转换 temp_data = xxx.getTemps() json_str = json.dumps(asdict(temp_data))
内容的提问来源于stack exchange,提问作者Nilusink
相关产品推荐
相关产品推荐

