Python类型提示中type和Type的区别是什么?
Python类型提示中type和Type的区别是什么?
今天,我遇到了一个用type
进行类型提示的函数。我已经进行了一些研究,想知道何时应该使用type
或Type
进行类型提示,但我找不到一个令人满意的答案。从我的研究结果来看,这两者之间存在一些重叠。
我的问题:
type
和Type
之间有什么区别?- 什么是一个使用示例,可以说明何时使用
type
和Type
?
研究
查看来自typing
标签3.7.4.3
的Type
的源代码,我可以看到这个:
# 内部类型变量,用于Type[]。 CT_co = TypeVar('CT_co', covariant=True, bound=type) # 这不是一个真正的泛型类。请勿在注释之外使用。 class Type(Generic[CT_co], extra=type): """可用于注释类对象的特殊构造。"""
看起来Type
可能只是type
的别名,只是它支持Generic
的参数化。这样理解对吗?
示例
下面是使用Python==3.8.5
和mypy==0.782
创建的一些示例代码:
from typing import Type def foo(val: type) -> None: reveal_type(val) # mypy输出:Revealed type is 'builtins.type' def bar(val: Type) -> None: reveal_type(val) # mypy输出:Revealed type is 'Type[Any]' class Baz: pass foo(type(bool)) foo(Baz) foo(Baz()) # 错误:"foo"的第1个参数具有不兼容的类型"Baz";期望的类型是"type" bar(type(bool)) bar(Baz) bar(Baz()) # 错误:"bar"的第1个参数具有不兼容的类型"Baz";期望的类型是"Type[Any]"
很明显,mypy
识别出了差异。