从其他函数注释派生的 Python 类型提示

Posted

技术标签:

【中文标题】从其他函数注释派生的 Python 类型提示【英文标题】:Python type hints derived from other function annotations 【发布时间】:2021-11-27 01:12:40 【问题描述】:

我有一个函数,我在内部调用另一个函数,其参数与我的函数中的参数相同。类型是由内部函数定义的,我想控制它。

有什么方法可以像内部函数一样使用相同类型的提示?

我尝试了什么

from typing import get_type_hints, Any

def inner(inner_param: int) -> int:
    return inner_param

a = get_type_hints(obj=inner).get("inner_param", Any)

def outer(my_param: a) -> None:
    result = inner(my_param)
    print(result)

outer("asd")  # Alert should go here

虽然a 是类(与int 相同) 静态类型分析对我不起作用(VS Code - Pylance)。

代码有问题吗?或者这还不可能?还是静态类型分析工具的问题?

在 python 文档中,声明 get_type_hints 不适用于别名,但是 PEP 563 (from __future__ import annotations) 和以后的评估可以解决它。

如果我将 int 类型转换为 str(或使用 annotation 中的 str 值),它仍然无法正常工作。

用例是,如果将来内部函数发生变化,我不想在这里有坏类型。

【问题讨论】:

【参考方案1】:

我会说你做的一切都是正确的。问题的根源在于类型分析工具。 Pylance,正如你所说,是一个静态类型分析工具。这意味着它不会执行任何行来分析您的代码。

但是,您的变量 a 需要定义执行。即使get_type_hints 的结果可能会以某种方式被静态猜测(Pylance 不会为你做,但理论上它似乎是可能的),将.get("inner_param", Any) 应用于它的结果是静态未知的,只能在运行时定义。

因此,对您的问题的简短回答是:“这是静态类型分析工具的问题”。长的已经在上面描述了。

【讨论】:

以上是关于从其他函数注释派生的 Python 类型提示的主要内容,如果未能解决你的问题,请参考以下文章

从用mypy注释的python函数返回None,多种返回类型

引用泛型类型的类属性

如何键入提示 Python 函数返回从超类派生的任何类的实例?

父对象的python类型提示字段

探索Python的多态是怎么实现的

派生类返回值的 PhpStorm 类型提示