如何不显式注解,为子类方法复用基类方法的类型提示
如何从基类构造函数获取类型提示来注解子类的**kwargs?
我需要给类A构造函数的参数c添加int类型提示,原始代码如下:
class B: def __init__(c: int): pass class A(B): def __init__(a: str, **kwargs): super().__init__(**kwargs)
我已经知道可以通过显式注解实现:
class B: def __init__(c: int): pass class A(B): def __init__(a: str, c: int): super().__init__(c=c)
我想了解是否可以通过类似以下方式,从基类B的__init__方法获取类型提示来注解**kwargs:
class B: def __init__(c: int): pass class A(B): def __init__(a: str, **kwargs: GetHintFrom(B.__init__)): super().__init__(**kwargs)
目前Python没有直接支持GetHintFrom(B.__init__)这种语法糖式的注解方式,但可以通过以下几种方法实现类似需求:
方法一:用
TypedDict复用基类参数类型
先定义一个对应基类构造参数的TypedDict,子类的**kwargs直接注解为这个字典类型,主流类型检查器(如mypy、pyright)都能正确识别:from typing import TypedDict class BInitParams(TypedDict): c: int class B: def __init__(self, c: int): pass class A(B): def __init__(self, a: str, **kwargs: BInitParams): super().__init__(**kwargs)方法二:Python 3.11+用
Unpack解包基类注解
Python 3.11引入的Unpack类型可以直接解包基类构造函数的参数注解,语法更简洁:from typing import Unpack class B: def __init__(self, c: int): pass class A(B): def __init__(self, a: str, **kwargs: Unpack[B.__init__.__annotations__]): super().__init__(**kwargs)方法三:通过
inspect模块动态提取类型
写一个工具函数提取基类构造函数的参数类型,运行时可以获取到类型提示,但部分类型检查器可能需要额外配置才能识别:import inspect from typing import Dict, Any def get_init_param_hints(cls) -> Dict[str, Any]: sig = inspect.signature(cls.__init__) return {name: param.annotation for name, param in sig.parameters.items() if name not in ('self', 'cls')} class B: def __init__(self, c: int): pass class A(B): def __init__(self, a: str, **kwargs: get_init_param_hints(B)): super().__init__(**kwargs)
其中TypedDict的方式兼顾了类型检查兼容性和代码可读性,是最推荐的方案。
内容的提问来源于stack exchange,提问作者Deo Leung
相关产品推荐
相关产品推荐

