gpt4 book ai didi

python - 子类 string.Formatter

转载 作者:太空狗 更新时间:2023-10-30 01:08:30 24 4
gpt4 key购买 nike

这里有一条评论:How to define a new string formatter ,我尝试子类化 string.Formatter。这是我所做的。不幸的是,我似乎在这个过程中把它弄坏了

import string
from math import floor, log10

class CustFormatter(string.Formatter):
"Defines special formatting"
def __init__(self):
super(CustFormatter, self).__init__()

def powerise10(self, x):
if x == 0: return 0, 0
Neg = x < 0
if Neg: x = -x
a = 1.0 * x / 10**(floor(log10(x)))
b = int(floor(log10(x)))
if Neg: a = -a
return a, b

def eng(self, x):
a, b = self.powerise10(x)
if -3 < b < 3: return "%.4g" % x
a = a * 10**(b%3)
b = b - b%3
return "%.4g*10^%s" % (a, b)

def format_field(self, value, format_string):
# handle an invalid format
if format_string == "i":
return self.eng(value)
else:
return super(CustFormatter,self).format_field(value, format_string)

fmt = CustFormatter()
print('{}'.format(0.055412))
print(fmt.format("{0:i} ", 55654654231654))
print(fmt.format("{} ", 0.00254641))

就像在最后一行中一样,我没有按位置引用变量,我得到了一个KeyError。显然期望在原始类中有一个可选的键,但我不明白为什么,我不确定我做错了什么。

最佳答案

str.format does auto numbering ,而 string.Formatter 没有。

修改 __init__ 并重写 get_value 即可。

def __init__(self):
super(CustFormatter, self).__init__()
self.last_number = 0

def get_value(self, key, args, kwargs):
if key == '':
key = self.last_number
self.last_number += 1
return super(CustFormatter, self).get_value(key, args, kwargs)

顺便说一句,上面的代码并没有严格模仿 str.format 行为。如果我们将自动编号与手动编号混合使用,str.format 会报错,但上面不会。

>>> '{} {1}'.format(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: cannot switch from automatic field numbering to manual field specification
>>> '{0} {}'.format(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: cannot switch from manual field specification to automatic field numbering

关于python - 子类 string.Formatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21664318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com