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

代码可正常执行但Pylance对@classmethod报缺cls参数,是否为Bug?

问题:Pylance对元类类方法调用提示参数缺失的疑问

这段单例元类代码运行完全符合预期,但在Visual Studio Code 1.78.0搭配Pylance v2023.5.10的环境中,调用Singleton.delete_all_instances()时,Pylance会提示"Argument missing for parameter 'cls'"——无论给delete_all_instances方法的cls参数标注什么类型,这个报错都会出现。想确认这是Pylance的Bug,还是代码本身存在未注意到的问题?

代码示例

from abc import ABCMeta
from typing import Dict, Any

class Singleton(ABCMeta):
    __instances: Dict[Any, Any] = {}
    def __call__(cls, *args: Any, **kwargs: Any) -> Any:
        if cls not in cls.__instances:
            cls.__instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.__instances[cls]

    @classmethod
    def delete_all_instances(cls: Any) -> None:
        cls.__instances = {}
        print("Deleted")

class Class1(metaclass=Singleton):
    def __init__(self) -> None:
        print("Constructor")
        self.__name = 'Class1'

    def say_name(self) -> str:
        return self.__name


if __name__ == "__main__":
    obj1 = Class1()
    print(obj1.say_name())
    Singleton.delete_all_instances()
    obj1 = Class1()
    print(obj1.say_name())

实际运行输出

Constructor
Class1
Deleted
Constructor
Class1

回答

这是Pylance的类型检查Bug。从Python语法本身来看,这段代码完全合法:元类的@classmethod会自动把元类本身(即Singleton)作为cls参数传入,运行时也确实正常工作,Pylance的报错属于误判。

可以通过两种方式解决这个提示问题:

  • 改用静态方法:因为delete_all_instances实际不需要依赖cls的动态类型,直接操作元类的类属性即可,改成静态方法后Pylance就不会报错:
    @staticmethod
    def delete_all_instances() -> None:
        Singleton.__instances = {}
        print("Deleted")
    
  • 保留类方法并忽略类型提示:如果一定要使用@classmethod,可以给调用行加注释跳过Pylance的错误提示:
    Singleton.delete_all_instances()  # type: ignore
    

内容的提问来源于stack exchange,提问作者user2606240

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:20:07