【问题标题】:Pass parameters to a decorator Class in Python将参数传递给 Python 中的装饰器类
【发布时间】:2020-01-16 12:45:37
【问题描述】:

我正在尝试为 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):

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-marshmallow


    【解决方案1】:

    你可以这样做:

    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 模块:) 见why

    【讨论】:

    • 工作,但如果我有两个地方使用@Schema,装饰器调用 Wrapped(cls) 没有 cls arg
    • 没关系,我的坏哈哈我解决了,谢谢你的回答:)
    猜你喜欢
    • 2018-08-24
    • 2018-12-04
    • 2014-11-17
    • 2013-03-10
    • 2015-10-22
    • 2020-05-16
    • 2021-01-19
    • 2021-11-21
    相关资源
    最近更新 更多