使用用户定义的类键入提示

Posted

技术标签:

【中文标题】使用用户定义的类键入提示【英文标题】:Type hints with user defined classes 【发布时间】:2017-11-23 15:30:12 【问题描述】:

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

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

def FuncA(arg: CustomClass):

还是这样:

from typing import Type

def FuncA(Arg:Type[CustomClass]):

【问题讨论】:

【参考方案1】:

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

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

如果你想要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>

带有C 注释的变量可以接受C 类型的值。在 相比之下,带有Type[C] 注释的变量可以接受以下值 是类本身 - 具体来说,它将接受 C的对象

文档包含一个 int 类的示例:

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

【讨论】:

@576i: iirc,你也可以使用字符串。所以def foo(bar: 'Qux') 等价于def foo(bar: Qux),只是它不需要立即加载类型。 @cs95 是的。所有类型提示都是 +3.7。 @WillemVanOnsem 有用! VS Code 还支持微软的 Python Linter,使用 Pylance(而不是 Jedi)python 语言服务器的调试器。【参考方案2】:

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]):

【讨论】:

这是 Python 3.9 的正确答案,因为不推荐使用 Willem Van Onsem 的答案中显示的typing.Type

以上是关于使用用户定义的类键入提示的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的类定义循环引用

VFP问题 用户可以给表单添加自定义属性和方法程序???

如何使用用户定义的类和 toDF 将 RDD 转换为数据帧

C#提示不只定义了一个入口点,请使用/main进行编译以指定包含入口点的类型

在 Python 3.6 中使用列表定义自定义类型提示

C语言如何使用其他文件定义的结构体?(C++报错:无法转换到不完整的类需在头文件中定义结构体??)