Как использовать attrs для десериализации в неизменяемый объект из строки? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть строковый журнал, который я хотел бы десериализовать в объект с как можно меньшим количеством стандартного кода.

В текущем решении не используются атрибуты:

# @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 для десериализации этого журнала в неизменный объект?

1 Ответ

1 голос
/ 16 апреля 2020

Лучшая практика - позволить 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__)
...