如何给内部定义函数的函数传入MyPy可接受的类型提示参数?
问题原因
MyPy 静态检查不允许将普通变量直接用作类型注解,你代码中函数参数 t 是运行时传入的动态类型(比如 Tuple[int] 这类泛型),不属于MyPy可静态识别的合法类型占位符,因此触发报错。
解决方案
因为你实现的是运行时类型校验工具函数,本身就属于静态类型检查的边界场景,直接针对性忽略对应静态检查错误,同时调整类型注解即可:
- 在使用
t作为类型注解的行添加# type: ignore[valid-type]注释,跳过MyPy对该行的类型合法性校验 - 用
Type[T]配合TypeVar注解函数参数t,可以保留调用侧的基础类型推导能力
修改后完整代码
from typing import Any, Type, TypeVar from beartype import beartype from beartype.roar import BeartypeCallHintPepParamException T = TypeVar('T') def typecheck(val: Any, t: Type[T]) -> bool: """ isinstance() 不支持 Tuple[int] 这类泛型校验,基于beartype实现运行时校验 """ @beartype def f(v: t) -> T: # type: ignore[valid-type] return v try: f(val) except BeartypeCallHintPepParamException: return False return True # 测试用例可正常通过运行和MyPy检查 def test_typecheck() -> None: assert typecheck((1,), tuple[int]) assert not typecheck((1,), tuple[str])
补充说明
如果不需要保留调用侧的类型推导能力,也可以直接将参数 t 的注解改为 t: Any,仅保留忽略注解行的MyPy错误即可,运行效果完全一致。
内容的提问来源于stack exchange,提问作者Eric Yabs
相关产品推荐
相关产品推荐

