问题描述
是否可以像这样在 NamedTuple
内部创建 NamedTuple
?
from typing import NamedTuple,List,Optional
class BabyData(NamedTuple):
name: str
age: int
body_measurement: Optional[NamedTuple('height': List,'weight': List)] = None
谢谢!
解决方法
您可能希望在此用例中使用 dataclasses
:
from typing import Optional
from dataclasses import dataclass
@dataclass
class Measurements:
height: list
weight: list
@dataclass
class Baby:
name: str
age: int
body: Optional[Measurements] = None
你也可以让类引用自己:
from __future__ import annotations
from typing import Optional
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
parent: Optional[Person] = None
,
提供的示例在运行时输出错误。
body_measurement: Optional[NamedTuple('height': List,'weight': List)] = None
^
SyntaxError: invalid syntax
要修复它,您需要
from typing import NamedTuple,List,Optional
class BabyData(NamedTuple):
name: str
age: int
body_measurement: Optional[
NamedTuple("BodyMeasurement",[("height",List),("weight",List)])
] = None
if __name__ == "__main__":
baby = BabyData(
name="john",age=1,body_measurement={"height": [50,51],"weight": [3,3.5]}
)
print(baby)
# BabyData(name='john',body_measurement={'height': [50,'weight': [3,3.5]})
实际上,您尝试混合定义 NamedTuple
的两种方式。根据{{3}}。
class Employee(NamedTuple):
name: str
id: int
# This is equivalent to:
Employee = collections.namedtuple('Employee',['name','id'])
您还应该考虑使用 the documentation,请参阅 dataclasses
。