Python 3 Объединение создания объекта и проверки схемы зефира в один класс - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь объединить создание объекта и проверку схемы в один класс, чтобы я мог сделать что-то вроде следующего:

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}")

Ожидаемое значение:

  1. Поля, предоставляемые для проверки по схеме
  2. Поля, которые должны быть присвоены атрибутам объекта с тем же именем
  3. Экземпляр объекта 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
...