Я пытаюсь объединить создание объекта и проверку схемы в один класс, чтобы я мог сделать что-то вроде следующего:
class Model:
def __init__(self, **kwargs):
# store each kwargs as object attribute
for key, value in kwargs.items():
setattr(self, key, value)
# TODO: add code to dynamically validate schema and return child object
class Customer(Model):
id = fields.Int(required=True)
name = fields.Str(required=True)
status = fields.Str(required=True)
customer = Customer(id=1, name="First Customer", status="PENDING")
print(f"{customer.id}, {customer.name}, {customer.status}")
Ожидаемое значение:
- Поля, предоставляемые для проверки по схеме
- Поля, которые должны быть присвоены атрибутам объекта с тем же именем
- Экземпляр объекта Customer, который будет возвращен
Я могу выполнить это sh с помощью гораздо большего количества кода, как показано ниже, но я пытаюсь объединить его, чтобы сделать его кратким и удалить тонну кода котельной пластины для каждого типа объекта.
class Model:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
class Customer(Model): pass
class CustomerSchema(Schema):
id = fields.Int(required=True)
name = fields.Str(required=True)
status = fields.Str(required=True)
@post_load
def create_object(self, data, **kwargs):
return Customer(**data)
customer = CustomerSchema().load({"id": 1, "name": "First Customer", "status": "PENDING"})
print(f"{customer.id}, {customer.name}, {customer.status}")
# Output: 1, First Customer, PENDING
ОБНОВЛЕНИЕ: Мне удалось заставить его работать, но я уверен, что есть лучший способ сделать это и, возможно, некоторые ошибки, которые мне не хватает.
class Model:
def __init__(self, **kwargs):
self.schema = type("Schema", (Schema,), dict(self.__class__.__dict__))
errors = self.schema().validate(kwargs)
if errors:
raise ValidationError(errors)
for key, value in kwargs.items():
setattr(self, key, value)
def __str__(self):
return str(self.schema().dump(self.__dict__))
class Customer(Model):
id = fields.Int(required=True)
name = fields.Str(required=True)
status = fields.Str(required=True)
customer = Customer(id=1, name="First Customer", status="PENDING")
print(f"{customer.id}, {customer.name}, {customer.status}")
# OUTPUT: 1, First Customer, PENDING