如何在 Python 中输入类的对象也遵守协议的提示?

问题描述 投票:0回答:2

我有一组类,我们称它们为

Foo
Bar
,它们都继承自当前范围之外(不是由我定义)定义的基类
Father
。我定义了一个协议类
DummyProtocol
,它有一个函数
do_something

class DummyProtocol(Protocol):
   def do_something(self):
      ...
   

class Foo(Father):
   def do_something(self):
      pass

class Bar(Father):
   def do_something(self):
      pass

我有一个功能

create_instance

def create_dummy_and_father_instance(cls, *args, **kwargs):
    return cls(*args, **kwargs)

我想以某种方式输入提示,cls 被输入提示接受类型为

Father
的类,该类也实现了
DummyProtocol

所以我将函数更改为此,以表明 cls 是一个继承自

Father
DummyProtocol

的类型
def create_dummy_and_father_instance(
    cls: Type[tuple[Father, DummyProtocol]], *args, **kwargs
):
    return cls(*args, **kwargs)

但是我在

mypy
中收到此错误:

Cannot instantiate type "Type[Tuple[Father, DummyProtocol]]"
python python-typing mypy
2个回答
5
投票

我遇到了同样的问题,并发现此讨论提议的

Intersection
类型似乎正是所需要的(例如,请参阅此评论)。

不幸的是,Python 类型系统尚不支持此功能,但 PEP 正在制作中。


2
投票

您可以定义第二个Father类,它继承自Father和Protocol(另请参阅mypy:如何验证类型是否具有多个超类):

class DummyProtocol(Protocol):

    def do_something(self):
        ...
    
class Father:
    pass
    
class Father2(Father, DummyProtocol):
    pass
    
class Foo(Father2):

    def do_something(self):
        pass
    
class Bar(Father2):

    def do_something(self):
        pass
    
class FooNot(Father):
    pass
    
def create_dummy_and_father_instance(
    cls: Type[Father2]
):
    return cls()
    
create_dummy_and_father_instance(Foo)
create_dummy_and_father_instance(Bar)
create_dummy_and_father_instance(FooNot)  # mypy error ok
© www.soinside.com 2019 - 2024. All rights reserved.