微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与 Mypy 兼容的类装饰器

如何解决与 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 的类实际上是绑定的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。