我应该如何在Python中为类类型编写类型提示?

class A(object):
    pass

class B(A):
    pass

def register(cls: type[A]):
    assert issubclass(cls, A)

 register(A)
 register(B)

type[A]是写这个的正确方法吗?

具体来说,我想指出的是,参数应该是

推荐答案

其他当前(2016年9月22日)的答案似乎不正确.根据PEP 484(关于类型提示),存在一个类对象类型的提示,称为Type[C].根据typing模块的文档,你可以使用typing.Type[C]来实现你想要的.我自己也在用Python 3.5.2.

引用the PEP:

有时,您想讨论类对象,尤其是从给定类继承的类对象.这可以拼写为[C]类型,其中C是一个类.澄清一下:C(当用作注释时)指的是C类的实例,而类型[C]指的是C的子类.

并引用the docs:

用C注释的变量可以接受C类型的值.相比之下,用[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]提示还有几个问题有待解决.

Python-3.x相关问答推荐

如何定义既允许固定单词又允许模式的pydanti.BaseModel?

CSV-DAT 转换时将引号添加到数据中

它们是否同样存储在python3的内存中?

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

Pandas 按值和索引对 DF 进行排序

使用 selenium 加速网页抓取

合并问卷中多列中的稀疏问题 - Pandas

在判断列表变量时如何判断特定列的值并分配加权整数值

集合操作:应该只适用于集合,但适用于 dict_keys?

spinbutton调整up/down箭头

如何在 VSCode 的在 Cloud Run Emulator 上运行/调试构建设置中添加 SQL 连接

RGB 图像中最主要的 colored颜色 - OpenCV / NumPy / Python

python3源的类图查看器应用程序

有没有更好的方法来判断一个数字是否是两个数字的范围

pandas 中 df.reindex() 和 df.set_index() 方法的区别

为 True 相交两个布尔数组

类型提示返回 NameError: name 'datetime' not defined

SQLAlchemy:如果不存在则创建模式

TypeError: write() 参数必须是 str,而不是字节(Python 3 vs Python 2)

使用 python 3.0 的 Numpy