collections.Counter的正确mypy类型注解写法是什么?
问题根源
你遇到的mypy报错本质是两个原因:
Counter泛型仅支持1个类型参数(仅需指定键的类型,值固定为int类型),你写的Counter[str, int]语法本身错误Counter.total()是Python 3.10新增的方法,旧版本的mypy自带的类型定义库(typeshed)未收录该方法的注解,才会报「无属性total」的错误
解决方案
1. 先修正注解写法
正确的Counter类型注解仅需传入键的类型参数即可:
from collections import Counter # 正确的函数注解写法 def f1(c: Counter[str]) -> None: print(c.total()) # 变量注解也要对应,不要用裸Counter默认的Any类型 c: Counter[str] = Counter() c.update(['a', 'b', 'c', 'a', 'b', 'c']) f1(c)
2. 修复total方法识别问题
根据你的环境二选一即可:
- 方案A:升级mypy到最新版本
只要将mypy升级到0.981及以上版本,自带的typeshed已经收录了Counter.total()的类型定义,升级后直接执行mypy校验即可通过:pip install --upgrade mypy - 方案B:兼容旧环境的替代写法
如果暂时无法升级mypy,或者需要兼容Python 3.10以下的运行环境,可以用sum(c.values())完全替代c.total()的功能,不需要修改类型注解就可以通过校验:def f1(c: Counter[str]) -> None: print(sum(c.values())) - 方案C:临时忽略报错
如果确定运行环境支持total()方法,也可以给该行加忽略注释临时绕过校验,不推荐长期使用:def f1(c: Counter[str]) -> None: print(c.total()) # type: ignore[attr-defined]
内容的提问来源于stack exchange,提问作者Adam Matan
相关产品推荐
相关产品推荐

