[英]Can a dataclass field format its value for the repr?
我有一个节点类以十六进制和 HSV 形式保存 RGB 数据。 我将使用它以各种方式对颜色进行排序,并且希望 HSV 元组保持浮动形式以进行比较,而不是每次使用都从字符串转换。 有没有办法向数据类字段指定它应该以类似于default_factory
的默认值的特定方式格式化值,即repr_factory
?
def RGB2HSV(r, g, b):
'''Returns HSV values in the range H = [0, 360], S = [0, 100], V = [0, 100]'''
r, g, b = r / 255, g / 255, b / 255
maxRGB = max(r, g, b)
minRGB = min(r, g, b)
delta = maxRGB - minRGB
V = maxRGB
if V == 0:
return 0, 0, V
S = delta / V * 100
if S == 0:
return 0, S, V * 100
if V == r:
H = (g - b) / delta
elif V == g:
H = 2 + (b - r) / delta
else:
H = 4 + (r - g) / delta
H *= 60
if H < 0:
H += 360
return H, S, V * 100
@dataclass
class Node:
r: int = field(repr=False)
g: int = field(repr=False)
b: int = field(repr=False)
hex: tuple[int, int, int] = field(init=False)
hsv: tuple[float, float, float] = field(init=False)
def __post_init__(self):
self.hex = self.r, self.g, self.b # Generating random r, g, b numbers
self.hsv = RGB2HSV(self.hex) # Converts the r, g, b to a tuple of floats
虽然我正在研究不同的类型,但我正在打印节点并且看到 10 个不必要的浮点数会分散注意力。 据我所知,我最好为类实现自己的__repr__
而不是依赖生成的数据类?
我查看__repr__
值的原因是因为它是由数据类自动生成的,并且可以比仅查看视觉输出更容易区分几乎相同的颜色。 如果我知道颜色的实际数字是什么,那么找出要更改或下一步做什么会更容易。 输出结尾的一部分:
Node(hex=(238, 0, 0), hsv=(0.0, 100.0, 93.33333333333333))
Node(hex=(238, 17, 0), hsv=(4.285714285714286, 100.0, 93.33333333333333))
Node(hex=(238, 34, 0), hsv=(8.571428571428571, 100.0, 93.33333333333333))
Node(hex=(238, 51, 0), hsv=(12.857142857142858, 100.0, 93.33333333333333))
Node(hex=(255, 0, 0), hsv=(0.0, 100.0, 100.0))
Node(hex=(255, 17, 0), hsv=(4.0, 100.0, 100.0))
Node(hex=(255, 34, 0), hsv=(8.0, 100.0, 100.0))
Node(hex=(255, 51, 0), hsv=(12.0, 100.0, 100.0))
基本上,可以为数据类字段指定格式,类似于如何为default_factory
指定函数,以便生成的__repr__
为我格式化字段,这样我就不必自己编写了?
...
hsv: tuple[float, float, float] = field(init=False, repr_factory=lambda x: "{:.3f"}.format(x) for x in self.hsv)
...
Node(hex=(238, 51, 0), hsv=(12.857, 100.000, 93.333))
数据类库目前不支持这样的格式化字段。 在默认__repr__
中为每个包含的字段生成的代码始终采用f'field={self.field!r}'
的形式。 您将不得不编写自己的__repr__
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.