代码可正常执行但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
相关产品推荐
相关产品推荐

