You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何封装带参数的Python装饰器?以预设参数的@dataclass为例

封装带参数装饰器:自定义@mydataclass替代预设参数的@dataclass

要实现预设kw_only=True和eq=False的@mydataclass装饰器,有两种简洁的实现方式:

方式一:使用functools.partial(推荐,支持扩展)

利用partial固定函数的部分参数,直接生成新装饰器,代码最简洁:

from dataclasses import dataclass
from functools import partial

# 绑定预设参数,生成新装饰器
mydataclass = partial(dataclass, kw_only=True, eq=False)

# 使用示例
@mydataclass
class Foo:
    a: int = 5

# 验证效果
if __name__ == "__main__":
    foo1 = Foo(a=10)
    foo2 = Foo(a=10)
    print(foo1 == foo2)  # 输出False,符合eq=False的设定
    try:
        Foo(10)  # 尝试位置参数,触发kw_only=True的限制
    except TypeError as e:
        print(e)  # 输出 positional argument follows keyword-only argument

这种方式的优势是:如果后续需要临时修改某个参数(比如给特定类开启repr=False),可以直接用@mydataclass(repr=False),无需修改装饰器代码。

方式二:手动实现装饰器函数(更直观)

如果不想依赖functools,可以手动写一个装饰器函数,直接调用带预设参数的dataclass:

from dataclasses import dataclass

def mydataclass(cls):
    # 用预设参数调用dataclass装饰器,处理传入的类
    return dataclass(kw_only=True, eq=False)(cls)

# 使用示例
@mydataclass
class Foo:
    a: int = 5

这个实现逻辑直白:装饰器接收被装饰的类cls,将其传入已绑定预设参数的dataclass装饰器中,返回处理后的类。

两种方式都能让@mydataclass完全等价于@dataclass(kw_only=True, eq=False),可以根据团队习惯选择。

内容的提问来源于stack exchange,提问作者VY_CMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:24:59