首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NamedTuple中使用带有可选类型的NamedTuple

在NamedTuple中使用带有可选类型的NamedTuple
EN

Stack Overflow用户
提问于 2021-01-10 16:26:01
回答 2查看 58关注 0票数 0

有没有可能像这样在NamedTuple中创建NamedTuple

代码语言:javascript
复制
from typing import NamedTuple, List, Optional
class BabyData(NamedTuple):
    name: str
    age: int
    body_measurement: Optional[NamedTuple('height': List, 'weight': List)] = None

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-01-10 17:11:02

您可能希望在此用例中使用dataclasses

代码语言:javascript
复制
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

您还可以让类引用自身:

代码语言:javascript
复制
from __future__ import annotations

from typing import Optional
from dataclasses import dataclass


@dataclass
class Person:

    name: str
    age: int
    parent: Optional[Person] = None
票数 4
EN

Stack Overflow用户

发布于 2021-01-10 17:17:00

提供的示例在运行时输出错误。

代码语言:javascript
复制
body_measurement: Optional[NamedTuple('height': List, 'weight': List)] = None
                                                  ^
SyntaxError: invalid syntax

要修复它,您需要

代码语言:javascript
复制
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', age=1, body_measurement={'height': [50, 51], 'weight': [3, 3.5]})

实际上,您尝试混合使用两种定义NamedTuple的方法。根据the documentation

代码语言:javascript
复制
class Employee(NamedTuple):
    name: str
    id: int
# This is equivalent to:

Employee = collections.namedtuple('Employee', ['name', 'id'])

您还应该考虑使用dataclasses,请参阅foxyblue's answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65651345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档