繁体   English   中英

数据类字段可以为 repr 格式化其值吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM