[英]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.