Python 3.14引入t-string机制 解耦求值与渲染防范注入漏洞

【python】t-string详解,从实现到使用 — 码农高天

码农高天

t-string将字符串格式化拆分为未渲染的中间模板,使程序能在最终输出前执行安全校验与惰性求值,从而在语法层阻断注入攻击并降低冗余开销。

AI-assisted summary of 【python】t-string详解,从实现到使用 — original source. Check the original for full context.

Source published:

Key ideas

  • Python 3.14 引入 PEP 750 规范的 t-string 特性,通过专有字节码在运行时生成由固定字符串元组与 Interpolation 插值对象组成的 Template 结构,保留表达式原文字段及格式化规范而不立即完成字符串序列化。 (0:00)
  • 与直接拼装字符串的 f-string 相比,t-string 将求值与最终渲染彻底解耦,为开发者提供了在真正输出前执行动态参数审查、防范 SQL 注入与 XSS 攻击的拦截机制。 (5:00)
  • t-string 带来了惰性求值能力,可在日志系统等场景中按需序列化高开销长文本,并且能够直接配合 Python 的 match...case 语法进行流式交替解析与优雅降级。 (5:00)

Detailed notes

## Background 该视频由技术博主“码农高天”于 2026 年 10 月 17 日发布在 YouTube 平台上。视频简介指出,本期内容围绕 Python 3.14 的新特性 t-string 展开,系统性讲解它与 f-string 的关系、底层实现机制以及在实际开发中的具体用法。

## TL;DR 视频深入剖析了 Python 3.14 依据 PEP 750 引入的全新语法特性 t-string。与直接完成字符串拼接求值的 f-string 不同,t-string 会被编译为包含 strings 与 interpolations 的未渲染 Template 对象,相当于提供了一个可编程的“中间态”。这种设计为开发者赋予了渲染前安全检查(如防范 SQL 注入或 XSS)以及按需惰性求值(如优化日志系统性能)的能力。结合 Python 的结构化模式匹配语法,开发者能够灵活定制插值校验与格式化管道,在保障工程严谨性的同时精简代码。

## Atmosphere & style 整期视频呈现出严谨硬核且真诚谦逊的技术分享氛围。高天以“通过向他人讲解来巩固自身盲区”作为切入点,态度自然亲切,毫无居高临下的说教感。在讲解过程中,他从底层字节码与数据结构层层剖析,再自然过渡到高阶应用场景与代码实战,逻辑严密而流畅,让人在直面深奥编译机制的同时感受到清晰透彻的解构快感。

## Bulletin - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) Python 3.14 引入 PEP 750 规范的 t-string 特性,通过专有字节码在运行时生成由固定字符串元组与 Interpolation 插值对象组成的 Template 结构,保留表达式原文字段及格式化规范而不立即完成字符串序列化。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 与直接拼装字符串的 f-string 相比,t-string 将求值与最终渲染彻底解耦,为开发者提供了在真正输出前执行动态参数审查、防范 SQL 注入与 XSS 攻击的拦截机制。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) t-string 带来了惰性求值能力,可在日志系统等场景中按需序列化高开销长文本,并且能够直接配合 Python 的 match...case 语法进行流式交替解析与优雅降级。

## Key takeaways - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) t-string 是 Python 3.14(PEP 750)引入的新特性,语法上只需将 f-string 的前缀 f 改为 t,但底层运行机制截然不同。 - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) Python 解释器引入了全新的专有字节码指令来支持 t-string,在求值时构造 string.templatelib.Template 模板对象。 - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) 每一个 Template 对象包含长度为 N+1 的 strings 不变文本片段元组,以及长度为 N 的 interpolations 插值元组。 - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) Interpolation 对象严格封装四个核心属性:即时求值结果 value、原始表达式字符串 expression、类型转换声明 conversion 以及格式化规则 format_spec。 - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) conversion(!r/!s/!a)与 format_spec 仅静态保存元数据以对齐 f-string 语法,t-string 底层并不会自动对其触发转换操作。 - [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) t-string 可视为 f-string 的中间产物,它保留了静态文本与动态插值的结构信息,将最终如何渲染的控制权完全交还给开发者。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 解耦渲染流程使开发者能够在生成最终文本前介入安全检查,例如在 SQL 拼接或 HTML 构造时对插值做统一转义,避免注入漏洞。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 支持惰性求值(Lazy Evaluation),特别适合日志记录场景,能够在生产环境日志级别未命中时免去复杂的字符串序列化开销。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) t-string 还可用于实现文本反向解析库(Parsing Library)以及在不改写类内部方法的前提下注入统一的调试信息。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 直接对 Template 对象进行循环迭代会交替产出 str 与 Interpolation,结合 Python 结构化模式匹配(match...case)能极简地编写校验与渲染管道。 - [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 尽管类似功能可通过自定义类实现,但 t-string 将常见需求收敛为原生语法,在提升开发体验的同时也需要开发者审慎设计、避免滥用。

## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) PEP 750 与 t-string 的底层实现机制

码农高天在开篇提到,上一期做代码审查(code review)视频时聊到 t-string 出现了一些错误,这说明自己对该特性的掌握还不够扎实。“对我来说学习一个知识最好的方法就是把这个知识给别人讲一遍,所以今天我就来给大家讲一下 t-string。”t-string 是 Python 3.14 引入的全新特性,其规范来源于 PEP 750。从代码语法上看,它与开发者非常熟悉的 f-string 高度相似,仅仅是将字符串前缀的 `f` 替换成了 `t`。

```mermaid flowchart TD accTitle: t-string 解析结构 accDescr: 展示 t-string 如何被解析为 Template 对象及其包含的 strings 和 interpolations

subgraph Input["源码输入"] TS["t'Number: {i:2d}.'"] end

subgraph TemplateObj["Template 对象 (string.templatelib.Template)"] direction TB subgraph StringsTuple["strings 元组 (N+1 = 2)"] S1["'Number: '"] S2["'.'"] end subgraph InterpTuple["interpolations 元组 (N = 1)"] subgraph Interp1["Interpolation"] V["value: 1"] E["expression: 'i'"] C["conversion: None (支持 r/s/a)"] F["format_spec: '2d'"] end end end

TS -->|"解释器编译并求值"| TemplateObj TemplateObj --> StringsTuple TemplateObj --> InterpTuple ```

虽然外表相似,但 t-string 的底层构造比普通字符串或 f-string 复杂得多。从 Python 解释器的字节码(bytecode)切入观察,可以发现 Python 为了支持 t-string 专门加入了若干全新的专有字节码。当 Python 解释器遇到 t-string 时,会将其编译为这些特定的字节码指令,在运行时动态构建两类核心对象:`Interpolation`(插值对象)与 `Template`(模板对象)。 在 t-string 中,每一个花括号结构 `{...}` 对应一个 `Interpolation`,它代表模板中可被动态替换的独立模块;而承载整个 t-string 求值结果的变量,则是一个属于 `string.templatelib` 库中 `Template` 类的对象。

这个 `Template` 对象由两个核心数据部分组成: 1. **`strings`**:一个由不可变文本片段构成的元组(tuple)。在示例 `t"Number: {i:2d}."` 中,它包含两段固定的字符串片段,第一段是前缀 `"Number: "`,第二段是末尾的句号 `"."`。 2. **`interpolations`**:一个由各处花括号插值结构构成的元组。每一个 `Interpolation` 对象均严格包含 4 个字段: - **`value`**:大括号内表达式的即时求值结果。若预先定义 `i = 1`,则该插值的 `value` 就是 `1`。 - **`expression`**:原始表达式的纯文本字符串。需要注意的是,该字段仅仅保留求值表达式本身(如 `"i"`),绝不包含后面冒号或感叹号所引出的格式化参数。 - **`conversion`**:字符转换声明。通过在花括号内添加感叹号与特定字符(仅限 `!r`、`!s`、`!a`,分别对应 `repr`、`str`、`ascii` 转换)指定。设计该字段完全是为了与 f-string 语法保持对齐与兼容,它本身不会自动对模板值进行任何转换,仅仅是一个静态保存的属性值。 - **`format_spec`**:格式化规范。由冒号后跟随的任意字符串构成(例如 `:2d`)。它具备极强的灵活性,冒号后书写的任何内容都会被原封不动保存到字段中,同样不会直接修改 `value`。

t-string 保证了一个严格的数学结构规则:如果一个模板中包含 $N$ 个花括号插值,底层就必然会对应长度为 $N$ 的 `interpolations` 元组,以及长度严格为 $N+1$ 的 `strings` 元组。即使某个插值位于字符串的最尾部、其后没有任何文本,解释器也会在末尾补充一个空字符串以补齐数量。

直观来看,t-string 可以被视为 f-string 的“中间产物”。普通的 f-string 在运行到对应行代码时,会立即完成表达式求值、套用格式化规则转换为目标字符串,并与固定文本拼接后返回最终的 `str` 对象;而 t-string 停留在未渲染的中间态——“他告诉你了我拿到了一个模板,这个模板前面有一块固定的,后面固定的,中间这块他给了一个值是个 i,他还给了我一个 spec,告诉我用 2d 的形式来把它给渲染,这个模板交给你了,以后怎么干你自己看着办。”

---

[05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) 核心优势、应用场景与代码实操

虽然开发者可以通过自定义规则把 t-string 手动渲染成和 f-string 完全一致的文本,但这绝非多此一举。将求值与拼接分离成“中间步骤”,至少带来了两个极其关键的架构优势:

首先是**渲染前的安全检查与逻辑拦截机制**。使用 f-string 时,程序会不可逆地直接完成字符串序列化;而在 t-string 模式下,开发者可以在真正生成最终字符串之前获得一个全面的审查机会。“我们不再是按照一个规则盲目的把这个 i 变成一个 string,我们可以先看一看这个 i 你是不是符合我的要求。”例如在生成 SQL 语句或 HTML 代码时,若需要直接插入用户输入的内容,开发者可以在中间层注入自定义验证逻辑或转义防护,从而从根源上杜绝 SQL 注入或 XSS 等安全隐患。

其次是**惰性求值(Lazy Evaluation)的性能红利**。将复杂对象直接格式化为字符串,或是拼装体量巨大的长文本,在底层往往存在明显的内存与算力开销。借助 t-string,系统可以在第一时间传递原始数据结构而不急于将其具体渲染。典型的场景是日志系统(logging):在不同的日志级别(log level)下,许多 DEBUG 级别的数据在生产环境下根本不需要被输出。若采用 f-string,即使该条日志后续被丢弃,格式化开销也已经在产生时被全额支付;而使用 t-string 则可以在确认当前日志级别需要实际落盘或输出时,再按需完成拼接与序列化。

跳出“f-string 替代品”的狭隘视角,t-string 的应用潜力更加广泛: - **模式提取与反向解析(Parsing Library)**:利用模板反向从现有文本中提取所需字段,将模板语义倒置使用。 - **动态条件渲染与上下文输出**:在不需要侵入式重写某些类的 `__str__` 或 `__repr__` 方法的前提下,集中在最终渲染管道中根据环境变量、开关状态等附加调试信息(debug information)。

针对有人认为这些能力完全可以通过定义 custom class(自定义类)来解决的质疑,码农高天表示赞同但进一步指出:“Python 是一个图灵完备的语言,就是你要的所有功能它都能用现在的方式去完成了,t-string 只是把大家常见的一个需求抽象出来,变成语法的一部分,相对来说这个语法还是比较简洁的。”

为了展现 t-string 的实际使用方式,视频给出了一个极简的处理循环:

```python # 遍历 template 的标准解包与模式匹配演示 template = t"Number: {i}."

result = [] for c in template: match c: case str() as s: result.append(s) case interpolation as interp: # 插入业务自定义拦截与校验 if not isinstance(interp.value, (int, float)): result.append("unknown") else: result.append(f"{interp.value}")

output = "".join(result) ```

当直接对 `Template` 对象使用 `for c in template` 进行迭代时,它会严格按照原始顺序交替产出:固定的 `string`、动态的 `Interpolation`、下一个 `string`,以此类推。结合 Python 的结构化模式匹配(Structural Pattern Matching,即 `match...case` 语法),可以极度清晰优雅地分类操作这两种类型。

在演示中,当输入 `i = 1` 时,程序正常渲染出 `Number: 1.`;而当把 `i` 恶意或无意修改为 Python 内置函数 `i = abs` 时,普通的 f-string 配合类型限定往往会直接抛出类型异常崩溃,而这段防御性的 t-string 处理逻辑能够捕获其非法类型并平滑回退,安全输出 `Number: unknown.`。相比在各处业务代码里散落着冗长的参数校验,使用统一的 t-string 管道处理能让全局语法显得更为整洁与轻便。最后,高天提醒大家 t-string 虽然机制极其灵活、存在海量探索空间,但在工程实践中一定要在真正读懂其机制后再审慎使用,切勿滥用。

## Notable quotes > [05:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=300s) Python 是一个图灵完备的语言,就是你要的所有功能它都能用现在的方式去完成了,t-string 只是把大家常见的一个需求抽象出来,变成语法的一部分,相对来说这个语法还是比较简洁的。 — 码农高天

> [00:00](https://www.youtube.com/watch?v=_9PR0C0Z5JE&t=0s) 对我来说学习一个知识最好的方法就是把这个知识给别人讲一遍。 — 码农高天

## Mentioned 码农高天, Python, PEP 750, t-string, f-string, Template, Interpolation, string.templatelib, SQL, HTML

## Video description 这期视频聊一下3.14的新feature t-string。它和f-string有什么关系,它是如何实现的,它该如何使用?一期视频全讲清楚!

[Source](https://www.youtube.com/watch?v=_9PR0C0Z5JE)

中文简报

Python 3.14引入t-string机制 解耦求值与渲染防范注入漏洞 t-string将字符串格式化拆分为未渲染的中间模板,使程序能在最终输出前执行安全校验与惰性求值,从而在语法层阻断注入攻击并降低冗余开销。 视频深入剖析了 Python 3.14 依据 PEP 750 引入的全新语法特性 t-string。与直接完成字符串拼接求值的 f-string 不同,t-string 会被编译为包含 strings 与 interpolations 的未渲染 Template 对象,相当于提供了一个可编程的“中间态”。这种设计为开发者赋予了渲染前安全检查(如防范 SQL 注入或 XSS)以及按需惰性求值(如优化日志系统性能)的能力。结合 Python 的结构化模式匹配语法,开发者能够灵活定制插值校验与格式化管道,在保障工程严谨性的同时精简代码。 Python 3.14 引入 PEP 750 规范的 t-string 特性,通过专有字节码在运行时生成由固定字符串元组与 Interpolation 插值对象组成的 Template 结构,保留表达式原文字段及格式化规范而不立即完成字符串序列化。 (0:00) 与直接拼装字符串的 f-string 相比,t-string 将求值与最终渲染彻底解耦,为开发者提供了在真正输出前执行动态参数审查、防范 SQL 注入与 XSS 攻击的拦截机制。 (5:00) t-string 带来了惰性求值能力,可在日志系统等场景中按需序列化高开销长文本,并且能够直接配合 Python 的 match...case 语法进行流式交替解析与优雅降级。 (5:00)

Reading summary

码农高天解析了 Python 3.14 基于 PEP 750 引入的 t-string 特性,指出其本质是保留未渲染状态的 f-string“中间产物”,使开发者能够在模板求值与最终字符串拼接之间执行安全校验与惰性求值。 底层对象架构与数学对称规则 (0:00) Python 3.14 在底层为 t-string 增加了专有字节码,当解释器解析形如 t'Number: {i:2d}.' 的语句时,不会直接生成普通字符串,而是构建 string.templatelib 中的 Template 对象。该对象严格包含两个部分:固定文本元组 strings,以及插值元组 interpolations。结构上,模板若包含 N 个插值,则 interpolations 长度为 N,strings 长度严格为 N+1,若末尾无文本则自动补齐空字符串。 每一个 Interpolation 对象固定封装 4 个字段:value 保存表达式的即时求值结果;expression 仅保留表达式纯文本(不含格式化符号);conversion 用于兼容 f-string 的 !r、!s、!a 声明;format_spec 则原样保存冒号后的格式化规则。conversion 和 format_spec 仅记录属性,不会在底层自动触发转换,将渲染控制权完全交由上层逻辑。 中间态带来的安全拦截与惰性求值优势 (5:00) 将求值与最终拼接解耦使 t-string 具备普通 f-string 所缺乏的控制能力。其核心优势之一在于渲染前的逻辑拦截机制。在生成 SQL 语句或 HTML 等场景中,开发者可以在真正拼接字符串前全面审查 Interpolation 的值并进行转义,从而在架构层面上阻断 SQL 注入或 XSS 隐患。 另一个关键收益是惰性求值。普通 f-string 无论最终是否使用,都会在执行行即刻完成格式化并占用算力与内存。而在日志处理等场景下,低级别(如 DEBUG)日志在生产环境中常被丢弃,借助 t-string 传递原始数据结构,可推迟到确认需要落盘时再完成序列化,避免无谓的开销。此外,模板还可倒置应用于文本反向提取,或集中注入调试信息而无需侵入类本身的 __str__ 方法。 交替迭代机制与模式匹配实操 (5:00) 在代码实现层面,直接对 Template 对象进行 for 循环迭代时,它会严格按照出现顺序交替产出固定字符串与 Interpolation 对象。利用 Python 的结构化模式匹配(match...case),开发者可以清晰地分离静态文本与动态参数,编写轻量、集中的防御性管道。 视频演示显示,若传入合规数值(如 i = 1),模板可按规则渲染为 'Number: 1.';当输入被无意或恶意赋值为内置函数 i = abs 时,传统的格式化通常会抛出异常导致程序中断,而 t-string 拦截逻辑可在匹配分支中捕获类型异常并平滑输出 'Number: unknown.',在保证语法整洁的同时增强了运行时的健壮性。 针对该特性可用自定义类替代的看法,码农高天指出图灵完备的 Python 引入 t-string 是为了将常见需求抽象为更简洁的语法;同时提醒开发者该机制虽然灵活多变,但在工程实践中必须深入理解其底层原理后再行采用,切忌盲目滥用。

Source quotes

[5:00] 码农高天: Python 是一个图灵完备的语言,就是你要的所有功能它都能用现在的方式去完成了,t-string 只是把大家常见的一个需求抽象出来,变成语法的一部分,相对来说这个语法还是比较简洁的。 [0:00] 码农高天: 对我来说学习一个知识最好的方法就是把这个知识给别人讲一遍。

Original transcript

[0:00] 我在上期code review的视频里面在聊到t string的时候犯了一些错误这充分说明我对t string还不是非常熟悉那对我来说学习一个知识最好的方法就是把这个知识给别人讲一遍所以今天我就来给大家讲一下T-Stream首先TString是一个很新的feature它来源于PEP750,是一个从3.14才有的feature它的形式和我们熟悉的F-Stream其实比较像的只是把前面的F换成了TT-Stream的构建其实还蛮复杂的所以我们先来看它的BiCode我们看这里是出现了一些比较陌生的bycode的这些是Python为了支持TStream新加入的bycode也就是说,Python的解释器在看到了TString之后就会把它编译成一些特殊的bytecode那在运行的过程中会建立两个东西 一个叫interpolation 一个叫template每一个t-string里面这种大括号对应的就是一个interpolation你可以把它理解为这个模板里面可替代的一个模块然后整个Tstring也就是保存到Template变量里的东西它是一个 template object我们可以在Debugger里面看一下这个template的类型就是string.template.lib这个库里面的template class而这个template object是由两个部分的数据组成的第一个部分叫stringsstrings是一个cupottuple里面是一段一段不变的自幅传固定自幅传在我们的这个例子里面就有两段第一段是前面这个number冒号空格第二段就是后面这个句号那 Interpolations 也是一个tuple它里面是一个一个的 interpolation就是我们刚才说的大括号这个结构对应的东西我们看每个interpolation里面一共有4个内容value是大括号里面这个表达式的值是多少我们第一行写了i=1所以这个interpolation的value就是1expression是整个表达式的string就是这个原始表达式是长成什么样子的这里就是一个爱conversion是指着我们这里怎么转化它这个值可以通过加感叹号 然后给个字母来给出但这个字母只能是R S和A分别对应这三种不同的conversion但是这里注意一下它这么设计完全是为了跟F-String去做对齐这个conversion本身对你的template其实没有任何影响他只是非常单纯的给这个点conversion负个值那还有一个format spec就是加一个冒号后面写任何的string那这个format spec就非常的灵活了你这个冒号想写什么就写什么他只会把这个string直接给你扔到format back里那和conversion一样for my spec也仅仅就是这个template里面的一个值他也不会对之前的value造成任何影响也就是说我的TStream里面如果出现了N个这种大功号那就一定会对应N个interpolation还会有N+1个strings就哪怕这个interpolation后面没有任何东西了他也会给你凑个coolstream在那就它会保证strings这个tuple的长度一定比interpolation这个tuple的长度多一个然后每个interpolation包含表达式的值原始的string还有conversion跟format spec的情况那这里为了讲的更清晰,我给大家展示一下大家注意这个expression 它只包含我们求职的那个表达式它并不包含home这些什么format spec之类的东西我们看这个interpolation的expression就只有这个i2d就是在format spec里的好 那问题来了 这个东西有什么用第一直觉上我们可以认为TString是FString的一个中间步骤就比如我们第二行的这个Fstream他直接返回的就是一个string它已经按照Fstream的规则把大括号里面这个我们后来称之为interpolation的东西给求了一下值 然后转化成了street又把这个string跟其他固定的部分拼接好了然后返回到s那对于t-string 实际上它就在一个中间的步骤他告诉你了我拿到了一个模板这个模板前面有一块固定的后面固定的中间这块他给了一个值是个爱他还给了我一个spec 告诉我用2D的形式来把它给渲染这个模板交给你了 以后怎么干 你自己看着办我们当然可以写一套规则把每个 [5:00] 最终都给渲染成这个F-Stream当然只有点脱了裤子放屁对吧那这个中间步骤对我们来说有什么好处呢哪怕我们最终就是想按照Fstream这个形式渲染其实也有两点非常明显的好处第一他在渲染前给了我们一个检查的机会我们不再是按照一个规则盲目的把这个爱变成一个string我们可以先看一看这个爱你是不是符合我的要求比如这里我只想渲染0到100的数如果这个数不对的话我就不认或者我渲染上别的这件事就是FString没有办法直接做到的这个功能比如说在我们做SQL或者做HTML的时候如果我们需要把用户输入给直接比如说渲染到一个string里那我们就可以做额外的检查对吧防止一些注入式攻击就这个地方你可以插入任何你想做的逻辑那这种形式其实还包含一个好处 叫做lazy evaluation就这里我只把数据给你但是你不着急给它变成 string因为变成string是有代价的可能这个object本身变成string这件事就很贵或者是你把很多很多个object拼接起来这件事也很贵那我把东西给你 你先别拼 未来没准你不需要拼呢比如说这里是一个logging需要输出的东西但是我们login会设置不同的level对吧有可能我输入的数据他在现在的level下是不需要输出的这个时候如果我用Fstream他就提前做了渲染的工作如果我用Tstream可能就会快这也是很多地方有可能会有的需求如果我们跳脱出TString只是FString的一个中间步骤这个角度的话你会发现T-Stream这个东西本身其实还是有非常多的可能性的就比如我们上次介绍的那个Parsing Library他最后的结果根本就不是一个string他把这个东西当成一个template然后从stream里面去提取数据哎他将来把这个 template 反之用这是S值运绝对没有办法做到的事情对吧或者是我 interpolation 它是条件渲染比如我某一些特殊的class啊我要给变成这样的stream或者说我在一些开关打开的时候在里面加更多的debug information那并不是所有时候我们都能去overwrite这个class的stringmethod或者是reprmethod用keystring的形式我们在最后渲染的那一步去统一处理这我们就可以做到 custom output那肯定有人会说t string现在完成的这些事情我之前用一个custom cast其实都可以完成确实是这样啊Python是一个图灵完备的语言就是你要的所有功能它都能用现在的方式去完成了T-String只是把大家常见的一个需求抽象出来 变成语法的一部分相对来说这个语法还是比较简洁的大家未来如果有这种把一个数据以自定义的形式变成Stream的需求可以尝试一下TStream啊那么快速的给大家写一个简单的例子我们看我们写了一段非常简单的程序啊首先讲一下这个4C IN template如果你直接把这个template当成一个iterable用fullc in的这种形式把它往下拿东西的话他就会按照顺序给你一个 string,给你一个 interpolation给你一个 string,给你一个 interpolation然后我们再用match这个语法去操作这两种不同的形式这里如果是一个string的话我们就直接再输出加上这个string如果是一个 interpolation我们就检查这个value如果这个value既不是int也不是float我们就写个unknown这就是我们自定义的逻辑 对吧否则我这里就随便来了一下我直接按照Fstream的形式把它给读出来我们看如果I等于1的话 输出就是number冒号1那我这比如随便写一个爱等ABS它现在就是一个函数对吧我们这里应该else一下 刚才程序写的不太对好 现在i不是一个数了 它是一个函数我们这就会打出来 number unknown他就不会报错你知道吧就假如我们真的传错数据了如果用 f string 这块就会直接爆一个 exception 出来那这样如果我要在很多地方去做这种T-Stream明显就比在这些地方分别检查简单很多就在语法上会更整洁那当然 T-string这个东西其实很灵活啊我们使用它还是有非常多的可能性的这个就给大家自己去探索但是最起码你现在知道这个t string是什么东西了别乱用啊你最起码看得懂好那这期视频这里请不吝点赞 订阅 转发 打赏支持明镜与点点栏目