给定一个参数定义为:
timestamp_filter: Callable[[str], bool] | None = None
并在过滤器中使用如下:
filtered_timestamps = set(filter(timestamp_filter, timestamps))
其中
timestamps
的类型为 set[int]
。
应用程序可以运行,但 mypy 抱怨此错误消息:
Argument 1 to "filter" has incompatible type "Callable[[str], bool] | None"; expected "None"
在我看来,mypy 只是在等待
None
。如果我明确地将 timestamp_filter
重新定义为 None
,错误就会消失,但当然我们正在消除它是可调用的可能性,这不是我想要的。
我还尝试用列表理解替换过滤器,即:
filtered_timestamps = [timestamp for timestamp in timestamps if timestamp_filter(timestamp)]
不幸的是没有成功。
查看
filter
的实际类型:它是重载的,而不是将联合类型作为其第一个参数(为了便于阅读而格式化):
Revealed type is "Overload(
def [_T] (None, typing.Iterable[Union[_T`1, None]]) -> builtins.filter[_T`1],
def [_T, _S] (def (_S`-1) -> TypeGuard[_T`1], typing.Iterable[_S`-1]) -> builtins.filter[_T`1],
def [_T, _S] (def (_S`-1) -> TypeIs[_T`1], typing.Iterable[_S`-1]) -> builtins.filter[_T`1],
def [_T] (def (_T`1) -> Any, typing.Iterable[_T`1]) -> builtins.filter[_T`1])"
第一个参数可以是类型
None
,也可以是 3 个可调用类型之一,但它不能静态是 None
和可调用类型的联合。