簡體   English   中英

Python類型提示:如何判斷X是Foo的子類?

[英]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它意味着clsA的實例,但我想說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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM