【发布时间】:2021-05-09 22:25:26
【问题描述】:
假设我有以下没有任何类型提示的简单示例:
def wrapper(cls):
class Subclass(cls):
def subclass_method(self):
pass
return Subclass
@wrapper
class Parent:
def parent_method(self):
pass
p = Parent()
p.parent_method()
p.subclass_method()
如何使用类型提示重构此代码,以便当我针对 Parent 的实例运行 mypy 时,它会同时识别 subclass_method 和 parent_method?
可能的解决方案:
-
使用 mixin
Parent(Mixin):有效,但避免使用装饰器。没有就可以实现吗? -
将方法修补到现有类上:在 mypy 中解析
subclass_method仍然存在相同的问题 - 自定义 Mypy 插件:不确定从哪里开始使用这个插件,或者如果没有它是否可能。
【问题讨论】:
-
您是否尝试过类似
def wrapper(cls) -> Callable[[...], "Subclass"]:的方法。也许您必须将类定义移到装饰器之外。 -
@schwobaseggl 是的,这就是我的想法,但我想
Subclass必须扩展一些Generic[T]才能让parent_method仍然得到验证。我在想这可能需要某种存根.pyi文件。 -
这种包装器的实际用例是什么?似乎比将
Subclassonce 定义为混合并直接使用(多重)继承更复杂。 -
你装饰的每个类都有一个不同的类提供
subclass_method,使你的类层次结构不必要地臃肿。 -
一旦实现Intersection,您可以将mixin 类移动到全局范围,然后使用类型提示
Intersection[T, SomeMixin]。不过目前这是不可能的。
标签: python decorator type-hinting mypy class-decorator