如何为Python类中所有方法统一添加带int类型注解的参数a?
统一为类方法添加带类型注解的参数
我定义了如下包含三个方法的类A:
class A: def func_1(self, a: int, b: int): print(a, b) def func_2(self, a: int, c: int): print(a, c) def func_3(self, a: int, d: int): print(a, d)
我希望避免重复编写a: int,请问是否有办法为这三个方法统一添加带int类型注解的参数a?目前我已搭建如下类装饰器框架:
def cls_decorator(cls): for key, value in cls.__dict__.items(): if callable(value): print(key, value, value.__dict__) # need to add `a: int` to functions here return cls @cls_decorator class A: ...
可以借助Python的inspect模块修改函数签名,结合functools.wraps保留原方法元信息,完成统一添加参数的需求。修改后的装饰器代码如下:
import inspect import functools def cls_decorator(cls): for name, method in cls.__dict__.items(): # 跳过特殊方法和非可调用属性 if not callable(method) or name.startswith('__'): continue # 获取原方法的签名 sig = inspect.signature(method) # 定义要添加的参数:a,类型注解为int,位置参数/关键字参数类型 new_param = inspect.Parameter( 'a', inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=int ) # 将a插入到self参数之后(实例方法默认第一个参数是self) params = list(sig.parameters.values()) if params and params[0].name == 'self': params.insert(1, new_param) else: params.insert(0, new_param) # 生成新的方法签名 new_sig = sig.replace(parameters=params) # 包装原方法,保留元信息 @functools.wraps(method) def wrapped(*args, **kwargs): return method(*args, **kwargs) # 为包装后的方法设置新签名和注解 wrapped.__signature__ = new_sig wrapped.__annotations__['a'] = int wrapped.__annotations__.update(method.__annotations__) # 替换类中的原方法 setattr(cls, name, wrapped) return cls
使用这个装饰器后,你可以在类A的方法中直接省略a: int的定义:
@cls_decorator class A: def func_1(self, b: int): print(a, b) def func_2(self, c: int): print(a, c) def func_3(self, d: int): print(a, d)
关键说明
- 签名调整:通过
inspect模块修改方法参数列表,确保a参数插入到self之后,符合实例方法的参数顺序规范。 - 元信息保留:用
functools.wraps保留原方法的名称、文档字符串等属性,避免破坏类方法的原有特性。 - 注解同步:手动更新
__annotations__字典,保证a的类型注解被正确添加,同时保留原方法的其他类型注解。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

