Python 3.8单例元类的类型标注错误排查与修正咨询
单例元类的正确类型标注方案
针对你遇到的Mypy报错,以下是修正后的完整实现及错误解析:
修正后的代码
from typing import Dict, TypeVar, Type, Any _T = TypeVar("_T") class Singleton(type): _instances: Dict[Type[_T], _T] = {} def __call__(cls: Type[_T], *args: Any, **kwargs: Any) -> _T: if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls]
错误原因及修正逻辑
- 关于
_T未绑定的报错:原代码中_instances的键使用了Any,导致类型变量_T无法和元类的实际类型建立关联。将键类型明确为Type[_T]后,Mypy就能正确识别_T是绑定到元类所创建的类的类型变量。 - 关于类型不兼容的报错:元类的
__call__方法中,cls的类型需要明确为Type[_T],同时_instances的类型调整后,能让Mypy确认擦除后的类型是元类的合法超类型,解决兼容性问题。
使用示例
class Config(metaclass=Singleton): def __init__(self, env: str) -> None: self.env = env # 验证单例特性 dev_config = Config("development") prod_config = Config("production") print(dev_config.env) # 输出 "development" print(dev_config is prod_config) # 输出 True
内容的提问来源于stack exchange,提问作者alexcs
相关产品推荐
相关产品推荐

