内置的字符串类提供了通过使用 PEP 3101 所描述的 format() 方法进行复杂变量替换和值格式化的能力。 string 模块中的 Formatter 类允许你使用与内置 format() 方法相同的实现来创建并定制你自己的字符串格式化行为。

class string.Formatter
Formatter 类包含下列公有方法:

format(format_string, /, args, *kwargs)
首要的 API 方法。 它接受一个格式字符串和任意一组位置和关键字参数。 它只是一个调用 vformat() 的包装器。

在 3.7 版更改: 格式字符串参数现在是 仅限位置参数。

vformat(format_string, args, kwargs)
此函数执行实际的格式化操作。 它被公开为一个单独的函数,用于需要传入一个预定义字母作为参数,而不是使用 args 和 *kwargs 语法将字典解包为多个单独参数并重打包的情况。 vformat() 完成将格式字符串分解为字符数据和替换字段的工作。 它会调用下文所述的几种不同方法。

此外,Formatter 还定义了一些旨在被子类替换的方法:

parse(format_string)
循环遍历 format_string 并返回一个由可迭代对象组成的元组 (literal_text, field_name, format_spec, conversion)。 它会被 vformat() 用来将字符串分解为文本字面值或替换字段。

元组中的值在概念上表示一段字面文本加上一个替换字段。 如果没有字面文本(如果连续出现两个替换字段就会发生这种情况),则 literal_text 将是一个长度为零的字符串。 如果没有替换字段,则 field_name, format_spec 和 conversion 的值将为 None。

get_field(field_name, args, kwargs)
给定 field_name 作为 parse() (见上文) 的返回值,将其转换为要格式化的对象。 返回一个元组 (obj, used_key)。 默认版本接受在 PEP 3101 所定义形式的字符串,例如 "0[name]" 或 "label.title"。 args 和 kwargs 与传给 vformat() 的一样。 返回值 used_key 与 get_value() 的 key 形参具有相同的含义。

get_value(key, args, kwargs)
提取给定的字段值。 key 参数将为整数或字符串。 如果是整数,它表示 args 中位置参数的索引;如果是字符串,它表示 kwargs 中的关键字参数名。

args 形参会被设为 vformat() 的位置参数列表,而 kwargs 形参会被设为由关键字参数组成的字典。

对于复合字段名称,仅会为字段名称的第一个组件调用这些函数;后续组件会通过普通属性和索引操作来进行处理。

因此举例来说,字段表达式 '0.name' 将导致调用 get_value() 时附带 key 参数值 0。 在 get_value() 通过调用内置的 getattr() 函数返回后将会查找 name 属性。

如果索引或关键字引用了一个不存在的项,则将引发 IndexError 或 KeyError。

check_unused_args(used_args, args, kwargs)
在必要时实现对未使用参数进行检测。 此函数的参数是是格式字符串中实际引用的所有参数键的集合(整数表示位置参数,字符串表示名称参数),以及被传给 vformat 的 args 和 kwargs 的引用。 未使用参数的集合可以根据这些形参计算出来。 如果检测失败则 check_unused_args() 应会引发一个异常。

format_field(value, format_spec)
format_field() 会简单地调用内置全局函数 format()。 提供该方法是为了让子类能够重载它。

convert_field(value, conversion)
使用给定的转换类型(来自 parse() 方法所返回的元组)来转换(由 get_field() 所返回的)值。 默认版本支持 's' (str), 'r' (repr) 和 'a' (ascii) 等转换类型。

例子:
class Person(object):
name = 'default name'
def init(self, name = ''):
self.name = name
me = Person('younger')
data = [me]
s = "my name is {person[0].name:^30}"
formatter = String.Formatter()
formatter.format(s, data)
输出结果:

formatter.format(s, person = data)
'my name is younger '

现在用Formatter.vformat方法
formatter.vformat(s, (), {'person' : data})
输出结果:

formatter.format(s, person = data)
'my name is younger '

我现在执行下面的程序
for i, v in enumerate(formatter.parse(s, start = 0)):
print i, v
结果会输出:
0 ('my name is ', 'person[0].name', '^30', None)
上面是返回的第1个编号为0的元组, 这4个值分别是
(literal_text, field_name, format_spec, conversion)
我们没有canversion, 所以第4项是None, 你也可以写上一个!r或者!s
这样的话字符串就变成了
s = "my name is {person[0].name!r:^30}"
前两项都很好理解,直接看字面就懂什么意思,第三项的意思是说格式化的时候的站位符,我这里用的是空,你也可以用星号,现在把s变成这样
s ="my name is {person[0].name!r:^30}"
输出的结果是:
"my name is **'younger'**
"
*号充当了占位符的作用

现在执行下面的程序:
for i ,v in enumerate(formatter.parse(s)):
temp = v

formatter.get_field(temp[1], (), {'person' : data})
输出结果为:
('younger', 'person')
用文档中的话来说就是 'object'和'used_key', 这个key和get_value中的key是相同的所以要调用get_value必须先调用get_field
下面继续执行代码
ret = formatter.get_value(formatter.get_field(temp[1], (), {'person':data})[1], (), {'person':data})
这个返回的 ret就是得到的对象,一个Person类型的list ,里面只有一个对象就是最初我们填充的那个,到此为止 , 所有的方法都跑了一遍,如果我们要改写自己的format语法,那就直接继承这个类,覆盖这么几个方法就行了,其余的2个方法很容易理解,可以直接看文档。

Formatter.format的语法
这里就不采用文档里的论道的方法来说明了,直接以我的理解来说好了

只有keyword类型的format string
最简单的:
"my name is {name}".format(name = 'younger')
带有多个组合条件的
"my name is {person[0].name!r:*^30}".format(person = data_list)
上面的意思是说传入的是一个list,list中有person, keyword是person[0].name, 很好理解,就是第0个对象的name属性, 这样用起来很方便, 非常好记, 从!r开始的奇怪语法是 Format Specification Mini-Language , 其中对一些数据类型,比如百分数,正负数, 复数, 大数,时间,小数点的位数,以及格式化format string的站位符等进行了定义,用法都和我写的例子一样,没有什么复杂的,这里例子已经算是比较复杂的例子了。
只有position类型的format string
"my name is {0.name}".format(person)
同时有position和keyword的formart string
"my name is {0.name}, I am living at {area[0].city}".format(person, area_list)
这里要注意的就是position的必须写再前面,不然是不能使用的,推荐大家一个格式化字符串里只用以个方式去写。