[英]Python type hinting: how to tell X is a subclass for Foo?
我應該如何在Python中為類類型編寫類型提示? 考慮以下代碼:
class A(object):
pass
class B(A):
pass
def register(cls: type[A]):
assert issubclass(cls, A)
register(A)
register(B)
type[A]
是寫這個的正確方法嗎? 如果我只使用cls: A
它意味着cls
是A
的實例,但我想說cls
是一個類/類型,至少是A
子類。
具體來說,我想指出的是參數應該是Django模型類型。
似乎其他當前(2016年9月22日)答案不正確。 根據PEP 484(關於類型提示),存在一個類對象類型的提示,稱為Type [C] 。 根據typing
模塊的文檔,您可以使用typing.Type [C]來實現您想要的。 我自己使用的是Python 3.5.2。
引用PEP :
有時您想要討論類對象,特別是從給定類繼承的類對象。 這可以拼寫為Type [C],其中C是一個類。 澄清:雖然C(當用作注釋時)引用類C的實例,但類型[C]引用C的子類。
並引用文檔 :
用C注釋的變量可以接受類型C的值。相反,用Type [C]注釋的變量可以接受類本身的值 - 具體地說,它將接受C的類對象。
並參考您的具體示例:
import typing
class A(object):
pass
class B(A):
pass
def register(cls: typing.Type[A]):
assert issubclass(cls, A)
register(A)
register(B)
您可以使用mypy靜態檢查此類代碼,它應該在簡單的情況下工作 - 請注意mypy是一項正在進行的工作,截至目前,有幾個問題打開了類型[C]提示。
要解決一般情況,您必須使用合適的__subclasscheck__
編寫元類。 可能,但很麻煩。
在您的Django模型類的特定情況下,已經存在一個顯式元類,因此注釋應該完成這項工作:
import django.db.model as model
def register(cls: model.base.ModelBase): ...
這將起作用,因為isinstance(models.Model, models.base.ModelBase)
為true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.