给定这种类型:
class TPerson(TypedDict):
name: str
address: str
我想要另一个
TypedDict
继承前一个,例如:
class TDealer(TPerson):
db-id: int
police_record: str
arrested_now: bool
class TConsumer(TPerson):
db-id: int
preferred_product: str
stoned_now: bool
但是,由于
db-id
不是有效的标识符
,
我需要使用函数语法
两者都适用于
TDealer
和
TConsumer
是否可以使用函数语法从另一个
TypedDict
继承?
我明白
TypedDict
定义如下:
class _TypedDict(Mapping[str, object], metaclass=ABCMeta):
但不确定100%是否是这样否!
如果没有,这可能是一个很好的解决方法?
是的,可以使用函数语法从另一个
TypedDict
继承。尽管
TypedDict
本身是用类语法定义的,但它也接受一个表示键和类型的字典作为参数。
以下是使用函数语法定义
TDealer
和
TConsumer
的方法,同时继承自
TPerson
:
from typing import TypedDict
class TPerson(TypedDict):
name: str
address: str
TDealer = TypedDict('TDealer', {
'db-id': int,
'police_record': str,
'arrested_now': bool,
**TPerson.__annotations__ # 使用 ** 将 TPerson 的键值对解包到新的字典中
})
TConsumer = TypedDict('TConsumer', {
'db-id': int,
'preferred_product': str,
'stoned_now': bool,
**TPerson.__annotations__
})
解释:
-
我们使用
TypedDict('TypeName', {...})
语法来定义新的TypedDict
。 -
在字典中,我们首先定义新的键值对,例如
'db-id': int
。 -
为了继承
TPerson
的键值对,我们使用**TPerson.__annotations__
。这会将TPerson
中定义的所有键值对解包到新的TypedDict
中。
这样,
TDealer
和
TConsumer
就继承了
TPerson
的所有属性,并且可以添加自己的属性,即使属性名包含连字符 (
-
)。