gpt4 book ai didi

python - 数据类字段可以为 repr 格式化它的值吗?

转载 作者:行者123 更新时间:2023-12-05 03:23:35 24 4
gpt4 key购买 nike

我有一个节点类以十六进制和 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

当我计算不同的种类时,我正在打印节点,看到 float 的 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__

关于python - 数据类字段可以为 repr 格式化它的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72504678/

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