Передать параметры классу декоратора в Python - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь написать декоратор для модели Db, чтобы сделать эту модель сериализуемой

def Schema(cls):
    class Schema(marshmallow.ModelSchema):
        class Meta:
            model = cls

    cls.Schema = Schema
    return cls


@Schema
class SerialInterface(sql.Model, InheritanceModel):
    id = sql.Column(types.Integer, primary_key=True)
    transmission_rate = sql.Column(types.Integer)
    type = sql.Column(sql.String(50))

    mad_id = sql.Column(types.Integer, sql.ForeignKey('mad.id'))

    serial_protocol = sql.relationship(SerialProtocol, uselist=False, cascade="all, delete-orphan")

Но я хочу передать вложенные объекты в этот декоратор, например:

@Schema(nested=['serial_protocol'])
class SerialInterface(sql.Model, InheritanceModel):

1 Ответ

2 голосов
/ 16 января 2020

Вы можете сделать что-то вроде:

def Schema(*args, **kwargs):
    def wrapped(cls):
        class Schema(marshmallow.ModelSchema):
            class Meta:
                model = cls

        cls.Schema = Schema
        return cls
    return wrapped

И тогда будет работать @Schema(nested=['serial_protocol']).

Как это работает, вы создаете функцию, которая принимает аргументы и возвращает декоратор. Оттуда декоратор работает как обычный Python декоратор.

@Schema(nested=['serial_protocol'])
class SerialInterface:
    ...

Декоратор переводится в:

SerialInterface = Schema(nested=['serial_protocol'])(SerialInterface)

Дополнительный совет, Используйте модуль functools.wraps :) См. почему

...