如何不借助typing.Protocol为含位置/关键字仅参数的Callable加类型提示?
不用
typing.Protocol给带位置/关键字仅参数的Callable加类型提示 标准的typing.Callable泛型没法区分位置仅参数(/)和关键字仅参数(*)——它只能定义参数类型顺序和返回值,不关心参数的传递方式,这就是你代码里类型报错的核心原因。
如果不想用Protocol,可以用字符串字面量形式的类型注解,直接写出函数的完整签名(包括/和*分隔符),主流静态类型检查器(比如mypy、pyright)都能正确解析这种语法:
from typing import Callable def add(arg: int, /, *, other: str) -> str: return f"{arg}{other}" # 直接用字符串写函数签名做类型提示 x: "(int, /, *, other: str) -> str" = add
这样标注后,类型检查器会正确识别:x指向的函数必须接受一个位置仅的int参数,以及一个关键字仅的str参数(参数名other),返回值为str,完全匹配add的签名约束。
这种字符串形式的注解属于“延迟解析”的类型提示,虽然不如静态泛型那么严谨,但完全满足你不用Protocol的需求,且能被主流工具支持。
内容的提问来源于stack exchange,提问作者Clue
相关产品推荐
相关产品推荐

