从其他函数注释派生的 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
是类
代码有问题吗?或者这还不可能?还是静态类型分析工具的问题?
在 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,多种返回类型