Published on

python format详解(译自PEP 3101)

Authors
  • avatar
    Name
    Lif
    Twitter

Python当前提供了两种字符串插值方法:

字符串的'%'运算符。[1] string.Template模块。[2]

其中,string.Template是新的写法,用来替代%。'%'运算符主要受以下事实限制:它是二进制运算符,因此最多可以接受两个参数。这些参数之一已经专用于格式字符串,而将所有其他变量压缩到其余参数中。 在python2.6之后的版本,会有一个内置的'format'方法,该方法采用任意数量的位置和关键字参数。

基本用法

"The story of {0}, {1}, and {c}".format(a, b, c=d)

在格式字符串中,每个位置参数都用一个从零开始的数字标识,因此在上例中,“ a”是参数0,而“ b”是参数1。每个关键字参数都由其关键字名称标识,因此在在上面的示例中,“ c”用于引用第三个参数。

还有一个全局内置函数“ format”,用于格式化单个值:\

print(format(10.0, "7.3g"))

需要打印括号的时候,可以使用括号的双倍转义

"My name is {0} :-{{}}".format('Fred')
#结果是 "My name is Fred :-{}"

简单和复合字段名称

简单字段名称可以是名称或数字。如果是数字,则它们必须是有效的以10为底的整数;如果是名称,则它们必须是有效的Python标识符。数字用于标识位置参数,而名称用于标识关键字参数。

复合字段名称是表达式中多个简单字段名称的组合:

"My name is {0.name}".format(open('out.txt', 'w'))

本示例说明了在字段表达式中使用'getattr'或点运算符。点运算符允许将输入值的属性指定为字段值。

与某些其他编程语言不同,我们不能在格式字符串中嵌入任意表达式。这是设计使然-可以限制使用的表达式类型。仅支持两个运算符:“.” (getattr)运算符和'[]'(getitem)运算符。

"My name is {0[name]}".format(dict(name='Fred'))

应该注意的是,格式字符串中“ getitem”的使用比其常规用法受到更多限制。在上面的示例中,字符串“ name”实际上是文字字符串“ name”,而不是名为“ name”的变量。解析项目密钥的规则非常简单。如果以数字开头,则将其视为数字,否则将其用作字符串。

格式说明符

每个字段还可以指定一组可选的“格式说明符”,可用于调整该字段的格式。格式说明符紧随字段名,并用冒号(':')分隔两者:

"My name is {0:8}".format('Fred')

格式说明符的含义和语法取决于要格式化的对象的类型,但是有一组标准的格式说明符用于任何不覆盖它们的对象。

格式说明符本身可以包含替换字段。例如,可以通过以下方式指定其字段宽度本身就是参数的字段:

"{0:{1}}".format(a, b)

在这种情况下,通常不会转义的结尾加的}。原因是因为转义的'{{''}}'语法仅在格式字段之外使用时才适用 。在格式字段中,大括号字符始终具有其正常含义。

格式说明符的语法是开放式的,因为类可以覆盖标准格式说明符。在这种情况下,str.format()方法仅将第一个冒号和匹配括号之间的所有字符传递给相关的基础格式化方法。