如何修改Python存根让类型检查器识别String与str兼容?
解决Python类型检查器不认可str赋值给子类类型属性的问题
你的核心问题是:虽然C++库底层支持把str赋值给String类型的属性,但Python类型检查器(如Pylance)遵循严格的类型规则——String是str的子类,父类实例不能直接赋值给子类类型的变量,所以会报错。以下是几种修改存根的可行方案:
方案1:用Union声明属性支持两种类型
直接修改Asset类的属性类型,让它同时接受String和str:
from typing import Union class String(str): def get_key(self) -> str: """Return the key for this property.""" ... class Asset: name: Union[String, str] = '' ...
这样my_asset.name = 'Foo'就不会触发类型错误。如果要调用String特有的get_key方法,用类型断言明确告知检查器当前值的类型即可:
from typing import cast my_asset.name = 'Foo' print(cast(String, my_asset.name).get_key())
方案2:给Asset添加__setattr__的类型约束
在Asset类中定义__setattr__方法,指定对应属性允许接受的输入类型,既保留原始属性的String类型声明,又让检查器认可str赋值:
class String(str): def get_key(self) -> str: """Return the key for this property.""" ... class Asset: name: String = '' ... def __setattr__(self, name: str, value: str | String) -> None: ...
方案3:修改String存根支持显式转换
因为str是不可变类型,在String的存根中添加__new__方法,让类型检查器认为str可以被转换为String:
class String(str): def __new__(cls, value: str) -> 'String': """从str创建String实例""" ... def get_key(self) -> str: """Return the key for this property.""" ...
之后可以用my_asset.name = String('Foo')的方式赋值,类型检查器会完全认可这种写法。
内容的提问来源于stack exchange,提问作者Boon
相关产品推荐
相关产品推荐

