【问题标题】:How to annotate mixin in Python如何在 Python 中注释 mixin
【发布时间】:2021-12-02 05:32:37
【问题描述】:

我有一个独立的函数,它使用super(),并像这样使用它:

import typing 
from abc import ABC

class Foo(typing.Protocol):
    def foo(): raise NotImplementedError

def free_foo(child):
    super(child.__class__, child).foo() 

class Base(ABC):
    pass

class Parent1(Base):
    def foo(self): pass

class Child1(Parent1):
    foo = free_foo

class Parent2(Base):
    def foo(self): pass

class Child2(Parent2):
    foo = free_foo

如何注释free_foo 函数?我需要指出child 既是Base 的实例又符合Foo 协议?

【问题讨论】:

  • 请注意,super(child.__class__, child) 本质上是损坏的。它将通过跳过 child 的实际类在 MRO 中搜索,从 second 条目开始,无论这是哪个条目。相反,它应该跳过foo 所在的。现在如果你定义另一个class GrandChild(Child2): def foo(self): return super().foo(),中间的free_foo会无限递归地调用自己。
  • 这是真的,但我真的找不到解决这个问题的方法。

标签: python type-hinting mypy python-typing


【解决方案1】:

我发现父类的正确顺序可以解决问题:

from abc import ABC

class FooBase(Foo, Base, ABC):
    pass

def foo(child: FooBase): pass

mypy 似乎对此很满意。

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2023-04-02
    • 2020-04-04
    • 2010-10-05
    • 2013-08-06
    相关资源
    最近更新 更多