如何在match-case的class-pattern中直接绑定关键字属性到变量?
如何在Python模式匹配中直接绑定class pattern的关键字属性并解决mypy类型报错?
可以直接将匹配到的关键字属性绑定到变量,不需要先绑定整个节点再取属性。你只需要在属性对应的子模式后面加上 as 变量名,就能同时完成匹配和变量绑定,而且mypy能正确识别绑定变量的类型。
修正后的示例代码
import ast tree = ast.parse('foo.bar = 2') for node in ast.walk(tree): match node: case ast.Attribute(value=ast.Name() as value): # 直接使用绑定的value变量,类型为ast.Name print(node) print(value) print(value.id) # mypy不会再报错,因为明确value是ast.Name类型
为什么原示例2会报错?
当你用 case ast.Attribute(value=ast.Name()) as attr 绑定整个节点时,mypy只知道 attr.value 的声明类型是 ast.expr(这是ast.Attribute类中value字段的定义类型),静态检查无法确定运行时它实际是ast.Name实例,所以会提示"expr has no attribute 'id'"。
而直接在子模式后加as value的方式,相当于告诉mypy:只有当value是ast.Name类型时才匹配这个分支,因此绑定的value变量类型会被推断为ast.Name,后续访问value.id就不会有类型报错。
内容的提问来源于stack exchange,提问作者Hyperplane
相关产品推荐
相关产品推荐

