如何封装带参数的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
相关产品推荐
相关产品推荐

