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

如何避免使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:42:06