与 Mypy 兼容的类装饰器

问题描述

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

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

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

可能的解决方案:

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

解决方法

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

    SELECT e.EmployeeId,e.FirstName,e.LastName,STUFF((SELECT ',' + COALESCE(LTRIM(RTRIM(t.TerritoryDescription)),'') 
    FROM EmployeeTerritories et
    INNER JOIN Territories t on et.TerritoryID = t.TerritoryID
    WHERE et.EmployeeID = e.EmployeeId
    FOR XML PATH('') ),1,'') as TerritoryList
    FROM Employees e

在这里,您定义 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 的类实际上是绑定的。