如何使用python打字.注释?

Jes*_*sse 76 python python-typing

我很难从文档中准确理解什么typing.Annotated是有好处的,并且更难在文档之外找到解释/示例。

或者它“对某事有好处”完全取决于您使用的第三方库吗?您会在什么(现实世界)环境中使用Annotated

小智 55

Annotatedpython 中允许开发人员声明引用的类型并提供与其相关的附加信息。

name = Annotated[str, "first letter is capital"]
Run Code Online (Sandbox Code Playgroud)

这表明它name是类型str并且name[0]是大写字母。

Annotated除了将额外信息(元数据)分配给引用之外,其本身不执行任何操作。由另一个代码(可以是库、框架或您自己的代码)来解释元数据并使用它。

例如,FastAPI 用于Annotated数据验证:

def read_items(q: Annotated[str, Query(max_length=50)])
Run Code Online (Sandbox Code Playgroud)

这里的参数q是 str 类型,最大长度为 50。此信息使用 Annotated 关键字传递给 FastAPI(或任何其他底层库)。


inn*_*tic 29

简单地说,这是一种表示该x类型有元数据的方式T

Annotated[T, x]
Run Code Online (Sandbox Code Playgroud)

其使用完全取决于您正在使用的库(或您的代码)

最终,如何解释注释(如果有的话)的责任是遇到注释类型的工具或库的责任。

您可以将其用作草莓中的惰性类型检查,因为可以安全地忽略它,如上所述:

如果一个库(或工具)遇到 typehint Annotated[T, x] 并且对元数据 x 没有特殊逻辑,它应该忽略它并简单地将类型视为 T。

或者你可以使用它来更安全地输入,就像在FastAPI中一样


小智 14

FastAPI 0.9.5(昨天发布)添加了对使用Annotated. 通过文档可以找到其用法的良好示例和解释,例如:


小智 5

就我而言,我将其用于草莓 GraphQL 库中的惰性类型。如果类型之间存在循环依赖关系,那么它非常有用。
示例: https: //strawberry.rocks/docs/types/lazy
oc7o