[英]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()
很好,因为您要求var
是MyClass
或其子类之一,这就是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.