0

我有一个字符串日志,我想用尽可能少的样板代码反序列化为一个对象。

当前解决方案不使用 attrs:

# @attr.s(frozen=True)
class MyLog():

    def __init__(self, log_str="a=1 b=2 c=3"):
        pairs = [pair.split('=') for pair in log_str.split(' ')]
        for k, v in pairs:
            print("{} = {}".format(k, v))
            # k = attr.ib(v)
        self.a = pairs[0][1]
        self.b = pairs[1][1]
        self.c = pairs[2][1]


print(MyLog().__dict__)

我可以attrs用来将此日志反序列化为不可变对象吗?

4

1 回答 1

1

最佳实践是让 init 获取属性值并使用工厂方法从您上面建议的字符串进行转换。

下面的代码未经测试,但它演示了这个想法:

@attr.s(frozen=True)
class MyLog():

    @classmethod
    def from_log_str(cls, log_str="a=1 b=2 c=3"):
        pairs = [pair.split("=") for pair in log_str.split(" ")]

        return cls(
            a=pairs[0][1],
            b=pairs[1][1],
            c=pairs[2][1],
        )

    a = attr.ib()
    b = attr.ib()
    c = attr.ib()

print(MyLog.from_log_str().__dict__)
于 2020-04-15T22:20:21.583 回答