如何避免使用self.__class__实例化数据类时的‘Unexpected argument’警告?
PyCharm数据类实例方法调用
self.__class__警告的解决办法 问题本质
这是PyCharm的类型推断bug,并非你的代码写法有问题。数据类的构造函数是由@dataclass装饰器自动生成的,PyCharm在处理self.__class__时,无法正确识别它指向的是带自动构造参数的数据类类型,从而误报"Unexpected argument"警告。而类方法中的cls参数因为有明确的类型绑定,PyCharm能正确识别构造参数,所以不会触发警告。
解决方法
改用
type(self)替代self.__class__
PyCharm对type(self)的类型推断逻辑更准确,替换后不会触发警告:from dataclasses import dataclass @dataclass() class Foo: x: float y: float @classmethod def origin_cls(cls): return cls(0., 0.) def origin_self(self): return type(self)(0., 0.) # 无警告添加类型注解明确类型
通过typing.Type给self.__class__标注类型,告诉PyCharm它的真实类型:from typing import Type from dataclasses import dataclass @dataclass() class Foo: x: float y: float @classmethod def origin_cls(cls): return cls(0., 0.) def origin_self(self): cls: Type[Foo] = self.__class__ return cls(0., 0.) # 无警告直接忽略该警告
如果不想修改代码结构,可以在警告行添加PyCharm专属注释禁用警告:from dataclasses import dataclass @dataclass() class Foo: x: float y: float @classmethod def origin_cls(cls): return cls(0., 0.) def origin_self(self): return self.__class__(0., 0.) # noinspection PyArgumentList
内容的提问来源于stack exchange,提问作者MrCrHaM
相关产品推荐
相关产品推荐

