Python类型提示中type和Type的区别是什么?

11 浏览
0 Comments

Python类型提示中type和Type的区别是什么?

今天,我遇到了一个用type进行类型提示的函数。我已经进行了一些研究,想知道何时应该使用typeType进行类型提示,但我找不到一个令人满意的答案。从我的研究结果来看,这两者之间存在一些重叠。

我的问题:

  • typeType之间有什么区别?
  • 什么是一个使用示例,可以说明何时使用typeType

研究

查看来自typing标签3.7.4.3Type的源代码,我可以看到这个:

# 内部类型变量,用于Type[]。
CT_co = TypeVar('CT_co', covariant=True, bound=type)
# 这不是一个真正的泛型类。请勿在注释之外使用。
class Type(Generic[CT_co], extra=type):
    """可用于注释类对象的特殊构造。"""

看起来Type可能只是type的别名,只是它支持Generic的参数化。这样理解对吗?


示例

下面是使用Python==3.8.5mypy==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识别出了差异。

0