簡體   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