0Pricing
Python Academy · 课时

typing.NamedTuple

为具名元组添加类型提示

typing.NamedTuple 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

类型化替代方案

typing.NamedTuple 基类是一种现代的、基于类的定义命名元组的方式。它添加了类型提示,写法也像普通类一样,因此大多数编辑器和类型检查器都比处理工厂形式更容易理解。

基于类的语法

继承 NamedTuple,并为每个字段声明类型注解。这样得到的结果仍然是真正的元组。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p)

相同的元组行为

工厂版本中的所有功能仍然有效:名称访问、索引访问、解包和不可变性。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p.x, p[1])
x, y = p
print(x, y)

内联默认值

只需在类体中为字段赋值,就可以为它提供默认值。有默认值的字段必须放在没有默认值的字段之后。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int
    z: int = 0

print(Point(1, 2))
print(Point(1, 2, 9))

添加方法

因为它是一个类,所以您可以添加真正的方法。这是 collections.namedtuple 工厂无法简洁实现的功能。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

    def distance_sq(self):
        return self.x ** 2 + self.y ** 2

print(Point(3, 4).distance_sq())

还可以添加属性

您还可以定义计算属性,根据字段派生出值。

from typing import NamedTuple

class Rectangle(NamedTuple):
    width: int
    height: int

    @property
    def area(self):
        return self.width * self.height

print(Rectangle(3, 4).area)

辅助方法同样保留

熟悉的元组辅助方法仍然可用:_replace()、_asdict() 和 _fields 的工作方式都相同。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p._asdict())
print(p._replace(x=9))

类型提示说明意图

这些注解不会在运行时强制执行,但它们能记录预期的类型,并让类型检查工具在运行程序之前发现错误。

from typing import NamedTuple

class Employee(NamedTuple):
    name: str
    salary: float
    active: bool = True

e = Employee('Alice', 5000.0)
print(e)

NamedTuple 与数据类

如何在两者之间选择:

  • NamedTuple:不可变,类似元组,支持索引和解包。
  • 数据类:默认可变(也可以冻结),不支持索引,但配置选项更多。
  • 当元组行为很重要时选择 NamedTuple;需要更丰富的记录结构时选择数据类。

嵌套与组合

命名元组很适合组合使用。一个字段可以是另一个命名元组,从而构建结构化的不可变数据。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

class Line(NamedTuple):
    start: Point
    end: Point

line = Line(Point(0, 0), Point(3, 4))
print(line.end.y)

作为函数返回类型

为函数添加注解,使其返回您的 NamedTuple,这样编辑器就能知道结果中各字段的类型。该注解记录了所返回记录的结构。

from typing import NamedTuple

class Stats(NamedTuple):
    minimum: int
    maximum: int

def analyze(nums) -> Stats:
    return Stats(min(nums), max(nums))

r = analyze([5, 2, 8])
print(r.minimum, r.maximum)

快速检查

与 collections.namedtuple 工厂相比,typing.NamedTuple 有什么优势?

回顾

您学会了为命名元组添加类型提示。

  • 继承带有字段注解的 typing.NamedTuple。
  • 以内联方式设置默认值,并添加方法和属性。
  • 辅助方法 _replace、_asdict 和 _fields 仍然有效。
  • 为了提高可读性并获得更好的工具支持,优先选择它而不是工厂形式。

常见问题解答

「typing.NamedTuple」课时是免费的吗?

是的 — 「typing.NamedTuple」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「typing.NamedTuple」这节课中我会学到什么?

为具名元组添加类型提示 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「typing.NamedTuple」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 枚举类
  2. IntEnum 与 Flag
  3. NamedTuple 基础
  4. typing.NamedTuple
← 返回 Python Academy