Python的sorted()用key=abs报类型警告而lambda写法正常的原因是什么
问题原因说明
你遇到的警告是Python静态类型检查工具(常见为Pyright、Pylance)的类型推断局限性导致的假阳性提示,way1写法运行时完全合法,两种写法的执行效果没有任何差异。具体原因如下:
sorted函数的key参数要求传入的可调用对象,返回值必须实现SupportsLessThan协议(支持大小比较),否则类型检查器会判定类型不匹配。- 内置函数
abs的通用类型签名定义为def abs(__x: SupportsAbs[_T]) -> _T,其中泛型参数_T没有默认绑定SupportsLessThan约束。当你直接将abs作为参数传入sorted时,类型检查器只会匹配abs的通用签名,不会自动推导当前场景下输入为int、返回的int类型天然支持大小比较,因此抛出警告。 lambda写法不会触发警告的原因:当你写lambda key: abs(key)时,类型检查器会先根据待排序列表ls的List[int]类型,推断出lambda的输入参数key为int类型,进而推导abs(key)的返回值为int,而int明确实现了SupportsLessThan协议,完全符合参数要求,因此没有警告。
如果需要消除way1的警告,可以在代码后加类型忽略注释:
print(sorted(ls, key=abs)) # type: ignore
内容的提问来源于stack exchange,提问作者zhyemqww
相关产品推荐
相关产品推荐

