Обратите внимание, что я уже упоминал вопрос StackOverflow здесь. Я публикую этот вопрос, чтобы выяснить, безопасно ли вызывать __post_init__
. Пожалуйста, проверьте вопрос до конца.
Проверьте приведенный ниже код. На шаге 3 мы загружаем dataclass
A
из строки yaml
. Обратите внимание, что он не вызывает метод __post_init__
.
import dataclasses
import yaml
@dataclasses.dataclass
class A:
a: int = 55
def __post_init__(self):
print("__post_init__ got called", self)
print("\n>>>>>>>>>>>> 1: create dataclass object")
a = A(33)
print(a) # print dataclass
print(dataclasses.fields(a))
print("\n>>>>>>>>>>>> 2: dump to yaml")
s = yaml.dump(a)
print(s) # print yaml repr
print("\n>>>>>>>>>>>> 3: create class from str")
a_ = yaml.load(s)
print(a_) # print dataclass loaded from yaml str
print(dataclasses.fields(a_))
Решение, которое я вижу на данный момент, это вызов __-post_init__
самостоятельно в конце, как в приведенном ниже фрагменте кода.
a_.__post_init__()
Я не уверен, что это безопасное воссоздание yaml
сериализованного dataclass
. Кроме того, это создаст проблему, когда __post_init__
принимает kwargs в случае, когда dataclass
поля имеют тип dataclasses.InitVar
.