繁体   English   中英

类的任何子类的实例的类型提示

[英]type hint for an instance of any subclass of a class

有没有办法做到以下几点?

def myfunction() -> any_subclass_of[MyClass]:
    ...

因为下面说赋值中有不兼容的类型:

def myfunction() -> MyClass:
    ...

var: MySubClass = myfunction()

Type[MyClass] 似乎也不起作用。

假如说

def myfunction() -> any_subclass_of[MyClass]:
    ...

意味着myfunction可以返回一个值,其类型是MyClass任何可能的子类(包括MyClass本身),那么类型提示很简单

def myfunction() -> MyClass:
    ...

类是协变的,因此MySubClass的任何实例也是MyClass的实例。

问题与

var: MySubClass = myfunction()

是您要求myfunction返回一个值,该值不仅是MyClass的实例,而且MySubClass的实例,而myfunction没有做出这样的承诺。 例如,

def myfunction() -> MyClass:
    return MyClass()

或者

class OtherClass(MyClass):
    pass


def myfunction() -> MyClass:
    return OtherClass()

静态类型检查器不会查看提示为返回MyClass的函数内部,以查看它“实际”返回的子类; 承诺是MyClass的一个实例将是,不多也不少。 结果,您根本无法myfunction()的值分配给使用MySubClass注释的变量,因为类型检查器无法保证这是安全的。


Type用于指示您将返回实际类型,而不是类型的值。 例如,

def myfunction() -> Type[MyClass]
    return MySubClass


var : Type[MyClass] = myfunction()

很好,因为您要求varMyClass或其子类之一,这就是myfunction返回的内容。

var : Type[MySubClass] = myfunction()

由于与上述相同的原因而失败:没有承诺myfunction的返回值不仅是MyClass或子类,而且是MySubClass或子类。

您想要TypeVar不起作用,请参阅评论。

from typing import TypeVar

MC = TypeVar("MC", bound="MyClass")

class MyClass:
    pass

class MySubClass(MyClass):
    pass

def myfunction() -> MC:
    ...

var: MySubClass = myfunction()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM