如何为带可选参数的回调函数指定Type Hint类型?
Python 带可选参数的回调函数类型标注方案
在Python中,Callable无法直接描述带可选参数的函数签名(用Optional[str]会要求必须传参,哪怕是None),要实现TypeScript里(a?: string) => string的等价效果,得用**Protocol**来定义自定义的函数协议:
步骤1:定义函数协议
从typing模块导入Protocol,然后创建一个描述回调函数签名的协议类:
from typing import Protocol class ParamCallback(Protocol): def __call__(self, param: str = "default") -> str: ...
这个协议规定了:回调函数可以无参调用(因为参数有默认值),也可以传入一个字符串参数调用,返回值必须是字符串。
步骤2:标注回调参数
把call函数里的回调参数类型换成这个协议:
def call(callback: ParamCallback) -> str: return callback() + callback("a")
测试验证
现在你的getParam函数可以正常传入,两种调用方式也都能通过类型检查:
def getParam(param: str = 'default') -> str: return param print(call(getParam)) # 输出:defaulta
为什么不用Callable?
Callable[[Optional[str]], str]的含义是「必须接收一个可选类型(可以是str或None)的参数」,调用时你必须传callback(None)或callback("a"),不能直接callback(),这和你需要的可选参数逻辑不符。而Protocol可以精准描述带默认参数的函数签名,完美匹配需求。
内容的提问来源于stack exchange,提问作者DarkTrick
相关产品推荐
相关产品推荐

