Python中用下划线忽略重写方法参数是否为公认写法?
处理重写方法中未使用参数的类型检查警告
公认的常用写法
针对重写父类方法但无需使用参数的场景,有几种被广泛接受的解决方式:
1. 单下划线_接收单个未使用参数
如果父类方法仅包含单个位置参数,最直观的写法是用_作为参数名:
class WithoutWarning(Parent): def foo(self, _): print("Hello world")
_是Python社区约定俗成的“无需使用的变量”标识符,Pyright/Pylance等类型检查工具会识别这个约定,不会触发未访问参数的警告。
2. *_ + **_接收任意未使用参数
你用到的*_, **_写法是合法且被认可的,它的核心优势是兼容父类方法参数的任意变更——不管父类后续新增位置参数、关键字参数,子类的这个写法都能保持参数列表匹配,不会出现报错。
Python标准库中确实存在这类写法的实例:
- 在
collections.abc模块的抽象类实现里,部分子类重写抽象方法时会用*_忽略所有位置参数,比如自定义容器类重写__contains__但不需要用到参数时:from collections.abc import Container class DummyContainer(Container): def __contains__(self, *_): return False - 在
unittest.mock模块的mock类实现中,也有用**_忽略关键字参数的场景,用于适配原方法的任意参数签名。
3. 注释标记未使用参数
如果不想修改参数名,也可以通过工具特定注释屏蔽警告:
class WithoutWarning(Parent): def foo(self, bar): # type: ignore[unused-argument] print("Hello world")
不过这种写法依赖具体工具的语法,通用性不如前两种。
关于*_, *__的写法
你提到的*_, *__是Python 3.10+支持的语法,用于接收多组未使用的位置参数,但这种写法过于冗余——除非有特殊的参数分组需求,否则完全没必要。通常*_足够接收所有未使用位置参数,**_接收所有未使用关键字参数。
总结推荐
- 若父类方法参数固定且数量少:优先用单个
_对应每个未使用参数,代码更直观。 - 若需要兼容父类参数的未来变更:用
*_, **_,一次处理所有位置和关键字参数。 - 避免冗余的
*_, *__写法,无特殊需求时无需使用。
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

