Python 3.12 Std_Libs - String - 格式化与编码
在之前的系列文章中,我们已经详细讨论了字符串的大小写转换、查找替换、去除空白与填充、分割连接、内容判断以及前缀后缀等方法。Python 的str类型还提供了几个独立且功能强大的实用方法,例如format、format_map、encode、maketrans、translate、expandtabs,以及对齐方法center、ljust、rjust、zfill等。这些方法在文本格式化、编码转换、字符映射等场景中扮演着重要角色。此外,标准库string中的Formatter类以及stringprep模块中的某些函数也与字符串处理相关。本文将从这些方法的用法出发,深入剖析 CPython 的底层实现,对比string模块的辅助功能,并结合国际化场景介绍stringprep的编码准备。通过大量示例和性能分析,帮助您全面掌握这些剩余的字符串实用方法。
一、字符串格式化方法:format与format_map
1.1str.format()基础
format方法是 Python 中最强大的字符串格式化工具之一,它通过{}占位符实现灵活的替换。基本语法:
"格式化字符串".format(参数1,参数2,...)占位符可以包含位置索引、关键字名、属性访问、元素索引以及格式说明符。
示例:
print("{} + {} = {}".format(2,3,5))# 位置参数print("{a} + {b} = {c}".format(a=2,b=3,c=5))# 关键字参数print("{0[0]} {0[1]}".format([10,20]))# 序列索引访问print("{point.x} {point.y}".format(point=Point(3,4)))# 属性访问格式说明符(:之后部分):
print("{:.2f}".format(3.14159))# 3.14print("{:>10}".format("right"))# 右对齐宽度10print("{:#x}".format(255))# 0xff1.2 底层实现(CPython)
format方法的实现位于Objects/unicodeobject.c中的unicode_format函数。它调用内部的PyUnicode_Format函数,该函数使用一个专门的解析器处理{}和格式说明符。核心步骤包括:
- 扫描格式字符串,识别文字部分和替换字段。
- 对每个替换字段,解析字段名(可能的属性或索引链),从传入的参数中获取对应的值。
- 根据格式说明符(如精度、对齐、类型)调用
PyObject_Format转换值为字符串。 - 将所有部分拼接成最终字符串。
由于需要解析和动态查找,format比 f-string(编译时处理)稍慢,但依然高效。
1.3str.format_map()方法
format_map(mapping)与format(**mapping)类似,但直接接受一个映射对象,而不需要解包为关键字参数。它特别适用于大型字典或自定义映射对象。
示例:
data={"name":"Alice","age":30}print("Name: {name}, Age: {age}".format_map(data)