0

假设我有以下没有任何类型提示的简单示例:

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()

如何使用 typehints 重构此代码,以便当我mypy针对 的实例运行时Parent,它会同时识别subclass_methodparent_method

可能的解决方案:

  • 使用 mixinParent(Mixin):有效,但避免使用装饰器。没有就可以实现吗?
  • 将方法修补到现有类上:仍然存在subclass_method在 mypy中解决的相同问题
  • 自定义 Mypy 插件:不确定从哪里开始使用这个插件,或者如果没有它是否有可能。
4

1 回答 1

2

如果没有包装器,这会简单得多。

class SomeMixin:
    def subclass_method(self):
        pass


class Parent(SomeMixin):
    def parent_method(self):
        pass


p = Parent()
p.parent_method()
p.subclass_method()

在这里,您定义SomeMixin 了一次,而不是每次调用包装器一次,并且该类SomeMixin是静态已知的。所有具有名称的各种类Subclass都是动态创建的,并且mypy无法静态Parent知道名称实际绑定到哪个类。

于 2021-02-05T15:20:21.050 回答