字符串格式化方法调用——高级的格式化方法语法

未匹配的标注

%表达式的另一个相似之处是可以通过在格式字符串中添加额外的语法来获得更多特定的布局。对于格式化方法,在可能为空的替换目标的标识符后使用冒号,跟着一个格式说明符(它可以命名字段大小、对齐和特定的类型码)。下面是可以在格式字符串中作为替换目标出现的正式结构——它的4个部分都是可选的,而且必须连在一起出现(中间没有空格)(译注:下面的英文有空格只是为了方便区分不同部分):

{fieldname component !conversionflag :formatspec}

在这个替换目标语法中:

  • fieldname 是指定参数的可选数字或关键字,它们可能会被省略来使用2.7,3.1和之后版本的相对参数编号。
  • component 是0或多个“.name”or“[index]”引用的字符串,用来获取参数的属性和索引值。它可能被省略来使用整个参数的值。
  • conversionflag 如果有的话,开始于一个!,它跟着r,sa来对值分别调用reprstrascii内置函数。
  • formatspec如果有的话,开始于一个:,它跟着指定值应该如何表示的文本,包括如字段宽度,对齐方式,填充,小数精度等细节,并以一个可选的数字类型码结尾。

在冒号后的formatspec组成部分有它自己丰富的格式,并被正式描述如下(方括号代表可选组成部分且不是字面上的编码):

[[fill]align][sign][#][0][width][,][.precision][typecode]

在这个里面:

  • fill可以填充除了{}的任何字符;

  • align可以是<>=或`,分别是左对齐,右对齐,符号字符后的填充,或居中对齐。

  • sign可以是+-或空格。

  • 从Python2.7和3.1开始,,(逗号)选项要求用逗号作为千分位分隔符。

  • widthprecision%表达式中的一样。

  • formatspec还可以包含嵌套的只有字段名称的 {}格式字符串,以从参数列表中动态获取值(很像格式化表达式中的 *)。

    data = {'name': 'Alice', 'age': 30}
    message = "My name is {name} and I am {age} years old. In {years} years, I will be {future_age}."
    
    for years in [5, 10, 20]:
      future_age = data['age'] + years
      print(message.format(years=years, future_age='{:{width}}'.format(future_age, width=len(str(future_age))+1), **data))

    例子中的 {:{width}}就是。

这个方法的typecode选项几乎和那些在%表达式中使用并之前在表7-4列出的选项完全重叠,但format方法还允许一个b类型码,用来以二进制格式显示数字(等价于使用bin内置函数调用),还允许一个%类型码,用来显示百分数,且只用d来显示底数为10的整数(这里不使用iu)。注意不像表达式的%s,这里的s类型码需要字符串对象参数;省略掉类型码来接受任何通用类型。

参考Python的库手册来获取这里省略掉的更多关于替换语法的知识。除了字符串的format方法外,单个对象也可以使用format(object, formatspec)内置函数(字符串的format方法内部使用的就是它)来格式化,

>>> salary = 10000.5
>>> formatted_salary = format(salary, '.2f')
>>> print("My salary is ${}".format(formatted_salary))
My salary is $10000.50

也可能在用户自定义类中使用 __format__操作符重载方法来定制(参见第六部分)。

# Using the format() built-in function with a user-defined class

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __format__(self, format_spec):
        if format_spec == 'n':
            return self.name
        elif format_spec == 'a':
            return str(self.age)
        else:
            return f"{self.name} ({self.age} years old)"

person = Person("Alice", 25)

print(format(person))
print("Name: {}".format(person))
print("Age: {}".format(person))
print("Info: {}".format(person))
print("Name only: {:n}".format(person))
print("Age only: {:a}".format(person))

可能为空的替换目标的标识符

# Anonymous fields
values = (2, 4, 6, 8)
print('The first value is {} and the last value is {}.'.format(*values))

# Output: The first value is 2 and the last value is 8.

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~