Python类型标注:如何表示wx.Control子类实例参数
正确的标准类型标注方案
你提到的Type[wx.Control]是错误用法——这个标注指向的是**wx.Control及其子类的类对象本身**(比如传入wx.SpinCtrl这个类,而非它的实例),所以PyCharm提示类型不匹配是合理的。
对于“接受任何wx.Control子类实例”的场景,Python typing模块提供的标准且正确的方案就是直接标注为wx.Control:
def basic_sizer(self, ctrl: wx.Control):
这是因为Python类型系统支持多态:所有子类实例都被视为父类类型的子类型,包括PyCharm、mypy在内的类型检查器都会认可这种标注,允许传入任何wx.Control的子类实例。
如果你之前觉得这种方式不可行,大概率是遇到了wxPython类型定义不完善,或是PyCharm类型检查配置的问题,但从Python typing的标准规范来说,这就是针对该场景的通用解决方案。
没有其他标准typing构造可以替代这种父类标注——Union需要枚举所有子类,显然不符合你的需求;而Protocol这类工具是用来定义结构而非继承关系的,也不适用此场景。
内容的提问来源于stack exchange,提问作者PChemGuy
相关产品推荐
相关产品推荐

