python中的格式化显示
format_spec是格式说明符,它是:
• format(my_obj, format_spec)的第二个参数,或者
• str.format()方法的格式字符串,{}里代换字段中冒号后面的部分
#示例1
>>> brl = 1/2.43 # BRL到USD的货币兑换比价
>>> brl
0.4115226337448559
>>> format(brl, '0.4f') # ➊
'0.4115'
>>> '1 BRL = {rate:0.2f} USD'.format(rate=brl) # ➋
'1 BRL = 0.41 USD'
➊ 格式说明符是’0.4f’。
➋ 格式说明符是’0.2f’。代换字段中的’rate’子串是字段名称,与格式说明符无关,但是它决定把.format()的哪个参数传给代换字段。
第2条标注指出了一个重要知识点:’{0.mass:5.3e}'这样的格式字符串其实包含两部分,冒号左边的’0.mass’在代换字段句法中是字段名,冒号后面的’5.3e’是格式说明符。格式说明符使用的表示法叫格式规范微语言。
b和x分别表示二进制和十六进制的int类型,f表示小数形式的float类型,而%表示百分数形式:
>>> format(42, 'b')
'101010'
>>> format(2/3, '.1%')
'66.7%'
格式规范微语言是可扩展的,因为各个类可以自行决定如何解释format_spec参数。
下面是内置的format()函数和str.format()方法的几个示例:
>> from datetime import datetime
>>> now = datetime.now()
>>> format(now, '%H:%M:%S')
'18:49:05'
>>> "It's now {:%I:%M %p}".format(now)
"It's now 06:49 PM"
#Vector2d.__format__方法,第1版
# 在Vector2d类中定义
def __format__(self, fmt_spec=''):
components = (format(c, fmt_spec) for c in self) # ➊
return '({}, {})'.format(*components) # ➋
➊ 使用内置的format函数把fmt_spec应用到向量的各个分量上,构建一个可迭代的格式化字符串。
➋ 把格式化字符串代入公式’(x, y)'中。
#Vector2d.__format__方法,第2版,现在能计算极坐标了
def __format__(self, fmt_spec=''):
if fmt_spec.endswith('p'): #➊
fmt_spec = fmt_spec[:-1] #➋
coords = (abs(self), self.angle()) #➌
outer_fmt = '<{}, {}>' #➍
else:
coords = self #➎
outer_fmt = '({}, {})' #➏
components = (format(c, fmt_spec) for c in coords) #➐
return outer_fmt.format(*components) #➑
➊ 如果格式代码以’p’结尾,使用极坐标。
➋ 从fmt_spec中删除’p’后缀。
➌ 构建一个元组,表示极坐标:(magnitude, angle)。
➍ 把外层格式设为一对尖括号。
➎ 如果不以’p’结尾,使用self的x和y分量构建直角坐标。
➏ 把外层格式设为一对圆括号。
➐ 使用各个分量生成可迭代的对象,构成格式化字符串。
➑ 把格式化字符串代入外层格式。
>>> format(Vector2d(1, 1), 'p')
'<1.4142135623730951, 0.7853981633974483>'
>>> format(Vector2d(1, 1), '.3ep')
'<1.414e+00, 7.854e-01>'
>>> format(Vector2d(1, 1), '0.5fp')
'<1.41421, 0.78540>'
如上所示为用户自定义的类型扩展格式规范微语言并不难.