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