You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

collections.Counter的正确mypy类型注解写法是什么?

问题根源

你遇到的mypy报错本质是两个原因:

  1. Counter泛型仅支持1个类型参数(仅需指定键的类型,值固定为int类型),你写的Counter[str, int]语法本身错误
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:06:04