如何消除Pylance类型错误?兼顾函数与字典的类型兼容
解决方法
直接用Constants.a做类型注解会报错,因为它是字符串字面量,不是合法的类型表达式。以下是两种符合要求的解决方案:
方案一:自定义字符串子类
通过创建一个继承自str的子类,让常量成为该子类的实例,这样就能用这个子类作为类型注解,同时保持字典和函数正常工作:
class ConstantType(str): pass class Constants: a = ConstantType('aaa') b = ConstantType('bbb') d = { Constants.a: 'a value', Constants.b: 'b value', } def print_constant(constant: ConstantType): print(constant) print_constant(Constants.a) print(d[Constants.a])
这样Pylance不会再报错,而且类型检查器会限制print_constant的参数只能是ConstantType的实例(也就是Constants.a或Constants.b),普通字符串会被识别为类型错误。
方案二:使用TypeVar限定类型范围
如果不想创建自定义子类,可以用TypeVar定义一个绑定到str的类型变量,同时用Final确保常量不会被修改:
from typing import Final, TypeVar ConstantValue = TypeVar('ConstantValue', bound=str) class Constants: a: Final[str] = 'aaa' b: Final[str] = 'bbb' d = { Constants.a: 'a value', Constants.b: 'b value', } def print_constant(constant: ConstantValue): print(constant) print_constant(Constants.a) print(d[Constants.a])
这个方案的类型检查宽松一些,允许传入任意字符串,但能解决Pylance的报错问题,同时保留原有代码的功能。
内容的提问来源于stack exchange,提问作者barciewicz
相关产品推荐
相关产品推荐

