使用用户定义的类型提示 类

Type hints with user defined classes

似乎找不到确定的答案。我想为函数做一个类型提示,类型是我定义的一些自定义 class,称为 CustomClass().

然后假设在某个函数中,调用它 FuncA(arg),我有一个名为 arg 的参数。输入提示 FuncA 的正确方法是:

def FuncA(arg: CustomClass):

或者会是:

from typing import Type

def FuncA(Arg:Type[CustomClass]):

前者是正确的,如果arg接受实例CustomClass

def FuncA(arg: CustomClass):
    #     ^ instance of CustomClass

如果你想要 class CustomClass 本身(或子类型),那么你应该写:

from typing import Type  # you have to import Type

def FuncA(arg: Type[CustomClass]):
    #     ^ CustomClass (class object) itself

就像文档中写的那样 Typing:

<b>class typing.Type(Generic[CT_co])</b>

A variable annotated with C may accept a value of type C. In contrast, a variable annotated with Type[C] may accept values that are classes themselves - specifically, it will accept the class object of C.

文档包含一个示例 int class:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'

Willem Van Onsem 的回答当然是正确的,但我想提供一个小的更新。在 PEP 585 中,标准集合中引入了类型提示泛型。例如,而我们之前不得不说例如

from typing import Dict

foo: Dict[str, str] = { "bar": "baz" }

我们现在可以放弃 typing 模块中的并行类型层次结构,只需说

foo: dict[str, str] = { "bar": "baz" }

此功能在 python 3.9+ 中可用,如果使用 from __future__ import annotations.

,则在 3.7+ 中也可用

就这个具体问题而言,这意味着我们现在可以使用内置 type:

简单地注释 类 而不是 from typing import Type
def FuncA(arg: type[CustomClass]):