定义TypedDict时引用其他TypedDict属性报错:illegal target for annotation
解决TypedDict间属性引用的语法错误
你写的代码报错是因为TypedDict的字段定义语法不支持'Detail.to_date': Optional[str]这种写法,下面分几种常见场景给出解决方案:
场景1:复用另一个TypedDict的字段类型
如果想让Overview的某个字段和Detail里的字段类型保持一致,直接通过索引引用目标TypedDict的类型即可:
from typing import TypedDict, Optional class Detail(TypedDict): id: Optional[str] to_date: Optional[str] from_date: Optional[str] class Overview(TypedDict): id: Optional[str] # 复用Detail中to_date的类型 to_date: Detail['to_date']
场景2:继承另一个TypedDict的所有字段
如果想让Overview直接拥有Detail的全部字段,再添加自己的额外字段,让Overview继承Detail即可:
from typing import TypedDict, Optional class Detail(TypedDict): id: Optional[str] to_date: Optional[str] from_date: Optional[str] class Overview(Detail): # 这里可以添加Overview独有的字段,比如 summary: Optional[str]
特殊场景:字段名确实是'Detail.to_date'
如果你的需求是字段名就是字符串'Detail.to_date'(这种情况很少见),需要通过__annotations__字典来定义,因为直接在类里写带点的字符串字段名会触发语法错误:
from typing import TypedDict, Optional class Detail(TypedDict): id: Optional[str] to_date: Optional[str] from_date: Optional[str] class Overview(TypedDict): id: Optional[str] # 动态添加带特殊字符的字段名 Overview.__annotations__['Detail.to_date'] = Optional[str]
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

