如何为默认值为空的可调用对象元组添加type hint以解决mypy报错
你遇到的报错本质是类型注解和默认值的语义不匹配:Tuple[Callable]在Python类型注解中表示长度恰好为1、元素为可调用对象的元组,而你提供的默认值()是长度为0的空元组,二者类型不一致,因此mypy抛出不兼容错误。
不需要添加无意义的占位可调用对象,有两种常用的合规解决方案:
方案1:调整为可变长度元组注解(适合允许传入任意数量可调用对象的场景,包含0个)
只需要在Tuple的类型参数末尾添加, ...,表示这是一个元素类型统一、长度任意的元组,空元组属于合法取值:from typing import Tuple, Callable, Any some_kwarg: Tuple[Callable[..., Any], ...] = ()这里显式写
Callable[..., Any]而非裸的Callable,是为了兼容mypy严格模式的校验规则,明确表示接收任意参数、返回任意值的可调用对象。方案2:联合固定长度元组类型(适合仅允许传入0或1个可调用对象的场景)
如果你的业务逻辑要求这个参数只能是空元组,或者仅包含一个可调用对象的元组,可以用Union联合两种固定长度的元组类型:from typing import Tuple, Callable, Any, Union some_kwarg: Union[Tuple[()], Tuple[Callable[..., Any]]] = ()
两种方案都不需要修改默认值,也不需要添加无意义的占位对象,即可通过mypy校验。
内容的提问来源于stack exchange,提问作者Alexander Soare
相关产品推荐
相关产品推荐

