使用可调用的过滤器中的类型不兼容

问题描述 投票:0回答:1

给定一个参数定义为:

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)]

不幸的是没有成功。

python python-typing mypy
1个回答
0
投票

查看

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
和可调用类型的联合。

© www.soinside.com 2019 - 2024. All rights reserved.