在 Python 中创建新的转换说明符

Creating new conversion specifier in Python

在 python 中,我们有像

这样的转换说明符
'{0!s}'.format(10)

打印

'10'

如何制作自己的转换说明符,例如

'{0!d}'.format(4561321)

按以下格式打印整数

4,561,321

或者转成二进制如

'{0!b}'.format(2)

输出

10

有哪些类需要继承和修改的功能?如果可能请提供一个小例子。

谢谢!!

你想做的是不可能的,因为内置类型无法修改,文字总是引用内置类型。

有一种特殊的方法来处理值的格式,即__format__,但它只处理格式字符串,不处理转换说明符,即您可以自定义如何处理{0:d}但不是 {0!d} 的样子。唯一可以与 ! 一起使用的是 sr.

请注意,db 已经作为格式说明符存在:

>>> '{0:b}'.format(2)
'10'

在任何情况下,您都可以实现自己的 class 来处理格式设置:

class MyInt:
    def __init__(self, value):
        self.value = value
    def __format__(self, fmt):
        if fmt == 'd':
            text = list(str(self.value))
        elif fmt == 'b':
            text = list(bin(self.value)[2:])
        for i in range(len(text)-3, 0, -3):
            text.insert(i, ',')
        return ''.join(text)

用作:

>>> '{0:d}'.format(MyInt(5000000))
5,000,000
>>> '{0:b}'.format(MyInt(8))
1,000

尽量不要自己制作并尝试使用 python 中已经存在的默认函数。你可以使用,

'{0:b}'.format(2)  # for binary
'{0:d}'.format(2)  # for integer
'{0:x}'.format(2)  # for hexadecimal
'{0:f}'.format(2)  # for float
'{0:e}'.format(2)  # for exponential

更多请参考https://docs.python.org/2/library/string.html#formatspec