如何为动态实现的不对称Python类属性添加类型提示?
解决动态属性的不对称类型提示问题
当通过__getattr__/__setattr__实现动态属性时,若需声明属性读取时为ObservableList、赋值时接受任意Iterable,同时避免编写完整的@property样板代码,可采用以下方案:
仅声明@property的类型注解而不编写实际逻辑,让父类AutoFrame的动态属性处理机制接管实际操作:
from typing import Iterable class ObservableList(list): """带变更事件的列表子类""" def custom_method(self): """ObservableList专属方法示例""" pass class AutoFrame: """提供动态属性实现的父类""" def __getattr__(self, name): return self.__dict__.get(name) def __setattr__(self, name, value): # 模拟AutoFrame自动将Iterable转换为ObservableList的逻辑 if hasattr(self, name) and isinstance(value, Iterable) and not isinstance(value, ObservableList): self.__dict__[name] = ObservableList(value) else: self.__dict__[name] = value class MyFrame(AutoFrame): # 仅定义@property的类型注解,无需实现具体逻辑 @property def my_list(self) -> ObservableList: ... @my_list.setter def my_list(self, val: Iterable) -> None: ... # 类型检查验证 my_frame = MyFrame() my_frame.my_list = [1,2,3] # Pyright允许赋值任意Iterable对象 my_frame.my_list.custom_method() # Pyright识别属性为ObservableList,无报错
说明
这种方式利用Pyright对@property类型注解的原生支持,仅定义属性的读写类型约束,实际的属性存取逻辑由AutoFrame的动态方法处理。既满足了类型检查的精准性,又避免了重复编写@property的样板代码,符合使用AutoFrame的初衷。
内容的提问来源于stack exchange,提问作者Torben Klein
相关产品推荐
相关产品推荐

