Pyparsing ParseResults属性类型提示报错,如何设置类型替代忽略?
解决Pyparsing中ParseResults的Pyright类型提示问题
针对你遇到的Pyright类型错误,有几种不依赖忽略报错的解决方案,核心是让静态类型检查器明确parsed.value的具体类型:
方法1:显式类型转换
直接将parsed.value转换为int,这是最直接的方式。因为pp.common.integer本身会把匹配到的字符串解析为整数,且你已经通过parse_all=True确保解析成功,所以转换操作是安全的:
from dataclasses import dataclass import pyparsing as pp @dataclass class Foo: value: int def parse_foo(line: str) -> Foo: grammar = pp.Keyword("FOO") + pp.common.integer("value") + pp.StringEnd() parsed = grammar.parse_string(line, parse_all=True) return Foo(value=int(parsed.value)) # 显式转换为int
方法2:使用类型断言(cast)
如果你确定parsed.value一定是int类型,可以用typing.cast告诉Pyright该值的具体类型,避免静态检查报错:
from dataclasses import dataclass import pyparsing as pp from typing import cast @dataclass class Foo: value: int def parse_foo(line: str) -> Foo: grammar = pp.Keyword("FOO") + pp.common.integer("value") + pp.StringEnd() parsed = grammar.parse_string(line, parse_all=True) return Foo(value=cast(int, parsed.value)) # 类型断言
方法3:自定义解析动作绑定类型
给pp.common.integer添加带类型注解的解析动作,帮助Pyright更准确地推断结果类型:
from dataclasses import dataclass import pyparsing as pp @dataclass class Foo: value: int def parse_foo(line: str) -> Foo: # 定义带明确返回类型的解析动作 def to_int(s: str, loc: int, tokens: pp.ParseResults) -> int: return int(tokens[0]) integer_with_type = pp.common.integer().set_parse_action(to_int) grammar = pp.Keyword("FOO") + integer_with_type("value") + pp.StringEnd() parsed = grammar.parse_string(line, parse_all=True) return Foo(value=parsed.value)
为什么pp.common.integer没自动生效?
pp.common.integer确实会将匹配的字符串转换为整数,但Pyparsing的ParseResults是动态的字典/对象混合结构,静态类型检查器(如Pyright)无法通过语法分析自动追踪到每个命名结果的具体类型,因此需要我们通过上述方式显式提供类型信息。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

