PyCharm提示参数未填充,即便Callable标注的所有参数均为可选
问题原因
你遇到的类型报错来自两个核心的类型注解匹配问题:
- 你定义的
func中第三个参数hide是仅限关键字参数(定义在签名的*符号之后),调用时只能通过关键字传参,不能按位置传递。但你写的Callable参数列表中的三个参数默认全部按位置参数处理,类型系统无法兼容仅限关键字参数的规则。 - 标准
Callable[[参数类型列表], 返回值类型]的语法本身不保留参数的默认值信息,即使原函数所有参数都配置了默认值,类型检查器也会认为你标注的input_function必须传入3个位置参数才能调用。
解决方案
方案1:使用Protocol定义函数协议(推荐,兼容Python 3.8+)
这种方式可以完整保留参数的类型、默认值、参数属性(位置/仅限关键字)信息,同时不丢失类型校验能力:
from typing import Protocol, Optional, Sequence, Awaitable # 先定义匹配func签名的函数协议 class InputFunction(Protocol): async def __call__(self, input_type: Optional[InputType] = None, formats: Sequence[str] = (), *, hide: bool = False ) -> str: ... # 替换你原来的类型注解 input_function: InputFunction = func
修改后你就可以按func的原生签名规则调用input_function,只传需要的参数即可,PyCharm不会再报参数缺失错误。
方案2:使用宽松的Callable注解(不推荐)
如果你不需要严格的参数类型校验,可以直接把注解修改为:
input_function: Callable[..., Awaitable[str]] = func
这种方式会跳过参数数量、类型的校验,虽然不会报错,但也失去了类型提示的保护。
注意事项
即使修改注解后,调用时如果要传hide参数,也必须使用关键字传参(比如input_function(input_type=xxx, hide=True)),不能按位置传递,否则依然会触发语法错误。
内容的提问来源于stack exchange,提问作者Jonathan1609
相关产品推荐
相关产品推荐

