You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给内部定义函数的函数传入MyPy可接受的类型提示参数?

问题原因

MyPy 静态检查不允许将普通变量直接用作类型注解,你代码中函数参数 t 是运行时传入的动态类型(比如 Tuple[int] 这类泛型),不属于MyPy可静态识别的合法类型占位符,因此触发报错。

解决方案

因为你实现的是运行时类型校验工具函数,本身就属于静态类型检查的边界场景,直接针对性忽略对应静态检查错误,同时调整类型注解即可:

  1. 在使用 t 作为类型注解的行添加 # type: ignore[valid-type] 注释,跳过MyPy对该行的类型合法性校验
  2. 用 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 04:09:03