Python 中的多态性和类型提示

Tob*_*eil 5 python polymorphism python-typing

考虑以下情况:

class Base:
    ...

class Sub(Base):
    ...

def get_base_instance(*args) -> Base:
    ...

def do_something_with_sub(instance: Sub):
    ...
Run Code Online (Sandbox Code Playgroud)

假设我get_base_instance在一个上下文中调用,我知道它会返回一个Sub实例 - 也许基于args我传递的内容。现在我想将返回的实例传递给do_something_with_sub

sub_instance = get_base_instance(*args)
do_something_with_sub(sub_instance)
Run Code Online (Sandbox Code Playgroud)

问题是我的 IDE 抱怨将Base实例传递给仅接受实例的方法Sub

我想我记得在其他编程语言中,我只是将返回的实例转换为Sub. 我该如何解决Python中的问题?根据返回类型有条件地抛出异常,或者有更好的方法吗?

Ric*_*ler 1

我认为当你考虑选角时,你的思路是正确的。我们可以使用castfromtyping来阻止 IDE 抱怨。例如:

from typing import cast


class Base:
    pass


class Sub(Base):
    pass


def get_base_instance(*args) -> Base:
    return Sub()


def do_something_with_sub(instance: Sub):
    print(instance)


sub_instance = cast(Sub, get_base_instance())
do_something_with_sub(sub_instance)
Run Code Online (Sandbox Code Playgroud)