0

0

Python format 方法的底层实现解析

冷漠man

冷漠man

发布时间:2026-02-18 08:24:02

|

306人浏览过

|

来源于php中文网

原创

str.format()是模板引擎式解析而非简单拼接,先编译格式串为指令序列再执行参数提取、类型转换等,性能低于f-string;支持动态字段名与多版本兼容,但format_spec解析逻辑分散、易出错。

python format 方法的底层实现解析

format 方法不是字符串拼接,而是模板引擎式解析

Python 的 str.format() 在调用时并不直接做字符串替换,而是先编译格式字符串为内部指令序列(类似小型字节码),再逐条执行:提取参数、类型转换、对齐填充、进制转换等。这意味着它比 % 格式化更重,也比 f-string 慢一个数量级。

常见错误现象:KeyError: 'name' 不是因为字典没这个 key,而是格式字符串里写了 {name},但传入的是位置参数而非命名参数;或者用了 **data 但 data 里真缺 key。

  • 使用场景:需要动态字段名、复用同一模板多次渲染、或兼容旧 Python 版本(str.format() 从 2.6 就支持)
  • 参数差异:'{0} {name}'.format('hi', name='bob') 混用位置和命名参数是合法的,但反过来 —— 命名参数后不能跟纯位置参数(会报 ValueError: cannot switch from manual field specification to automatic field numbering
  • 性能影响:每次调用都重新解析格式串;若格式串固定,可提前用 string.Formatter().parse() 缓存解析结果,但极少有人这么做——f-string 更快更直观

format 的 format_spec 解析逻辑不透明,容易误解对齐和精度

format_spec(冒号后面的部分)看似简单,实则规则分散在不同类型实现里。比如 '{:05d}'.format(42) 走的是 int.__format__,而 '{:.2f}'.format(3.1415) 走的是 float.__format__,两者对 0^, 等符号的处理逻辑不同,且文档藏得深。

常见错误现象:'{:08x}'.format(-1)ValueError: Unknown format code 'x' for object of type 'int' —— 因为负数不支持 x,必须先取绝对值或用 & 0xFF 截断;又如 '{:05}'.format('hi') 补的是空格不是 0,因为字符串默认忽略前导填充字符。

立即学习Python免费学习笔记(深入)”;

eMart 网店系统
eMart 网店系统

功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标

下载
  • 对齐符号 /<code>>/^ 只对字符串和数字生效,但数字默认右对齐,字符串默认左对齐,混用易出错
  • 精度(.N)对字符串是截断长度,对浮点数是小数位数,对整数加 f 格式才生效(如 '{:0.2f}'.format(42)'42.00'
  • 逗号千位分隔符 ,intfloat 有效,但对 Decimal 需要显式指定 locale 或用 format(..., ',')

自定义类怎么让 format 正常工作?别只写 __format__

仅实现 __format__(self, format_spec) 不够。如果用户写了 '{!r}'.format(obj),走的是 __repr__;写了 '{!s}',走的是 __str__;只有没加转换标志时,才调用 __format__。而且 __format__ 必须自己解析 format_spec,Python 不帮你拆。

常见错误现象:自定义类返回 int 子类,以为能直接用 '{:04x}',结果报错 —— 因为子类没继承 int.__format__,必须显式委托:return int(self).__format__(format_spec)

  • 正确做法:在 __format__ 开头先检查 format_spec 是否为空,再按需分发;或直接调用内置类型同名方法(如 str(self).__format__(format_spec)
  • 不要在 __format__ 里 raise ValueError 后不说明支持哪些 spec,用户根本不知道该传什么
  • 如果类语义上就是数值(如带单位的 Duration),建议同时实现 __int__/__float__,方便用户手动转再 format

format 和 f-string 的行为差异不止是性能

二者在语法糖层面相似,但语义不同:f-string 是编译期求值,format 是运行期解析。这导致一些边界情况表现不一致,比如作用域、异常时机、甚至字符串内容本身。

常见错误现象:f'{x}'x 未定义,报 NameError 在表达式求值时;而 '{}'.format(x) 同样报 NameError,但发生在 format() 调用时 —— 如果这个调用被包在 try/except 里,就能捕获;f-string 的错误无法被运行时捕获。

  • 嵌套大括号:f'{{ {x} }}' 要写两对大括号才输出一对;'{{ {} }}'.format(x) 则只需一对外层大括号({} 在 format 字符串里需转义为 {{}}
  • format 支持 !s/!r/!a 转换标志,f-string 不支持(必须手动调 str(x)repr(x)
  • format 的字段名支持属性链和下标,如 '{obj.items[0].name}'.format(obj=container);f-string 只支持表达式,等价写法是 f'{container.items[0].name}',但调试时更难定位哪一级出错

真正复杂的地方在于 format_spec 的解析分散在各类型中,没有统一入口;你改了一个类的 __format__,可能影响下游所有用它做字段的 format 调用,而且很难测全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

591

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

559

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

435

2024.03.13

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

865

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

449

2024.06.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

553

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

462

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号