Python类变量调用内部辅助函数mypy报错解决及写法合理性咨询
解决方案
- 方案1:使用
@staticmethod装饰器修饰_foo方法,完全符合Python类方法语义的同时可以解决mypy报错,修改后代码运行效果和原代码完全一致:
# foo.py class A: @staticmethod def _foo(): print('hello world') bar = {'foo': _foo} def run_bar(self): self.bar['foo']() def main(): A().run_bar() if __name__ == '__main__': raise SystemExit(main())
- 方案2:将该无参函数移到类定义外部作为顶层函数使用,避免被mypy判定为需要参数的实例方法,逻辑和原代码完全等价:
# foo.py def _foo_impl(): print('hello world') class A: bar = {'foo': _foo_impl} def run_bar(self): self.bar['foo']() def main(): A().run_bar() if __name__ == '__main__': raise SystemExit(main())
关于原写法是否属于不良实践
原写法确实属于不符合常规语义的不良实践,原因如下:
- Python类定义体中直接用
def声明的函数,默认语义就是类的实例方法,所有开发者阅读代码时都会默认预期这类函数第一个参数是self,你现在的写法会增加代码的理解成本,甚至会被其他维护者误以为是漏写self的bug。 - 如果你后续直接通过实例调用
_foo方法(比如A()._foo()),会直接抛出参数缺失的运行时错误,存在隐式风险。
内容的提问来源于stack exchange,提问作者Dominique Garmier
相关产品推荐
相关产品推荐

