运行Python文档示例时遭遇TypeError:Point() accepts 0 positional sub-patterns (2 given)问题咨询
解决TypeError: Point() accepts 0 positional sub-patterns (2 given)的问题
你遇到的这个错误,核心原因是Python的结构模式匹配(也就是你用的match语句)不会自动解构自定义类的实例——除非你明确告诉它该如何提取实例里的属性。
你的Point类只定义了__init__方法,但没有给模式匹配引擎提供足够的信息,让它知道怎么把Point(x,y)这种位置式模式对应到实例的x和y属性上。
两种可行的解决方案:
方案1:给Point类添加__match_args__元组
这个元组会告诉模式匹配引擎,在使用位置模式时,应该按顺序匹配哪些属性。修改你的Point类:
class Point(): __match_args__ = ('x', 'y') # 新增这一行,指定位置匹配的属性顺序 def __init__(self, x, y): self.x = x self.y = y x, y = 5, 5 point = Point(x, y) match point: case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"Not on the diagonal")
这样修改后,Point(x,y)就能正确匹配实例的x和y属性了,你的代码会正常输出Y=X at 5。
方案2:使用关键字模式匹配
如果你不想修改Point类,也可以在case语句里用关键字来指定要匹配的属性,这样不需要依赖__match_args__:
class Point(): def __init__(self, x, y): self.x = x self.y = y x, y = 5, 5 point = Point(x, y) match point: case Point(x=x, y=y) if x == y: # 用关键字明确指定属性 print(f"Y=X at {x}") case Point(x=x, y=y): print(f"Not on the diagonal")
这种写法同样能正常工作,而且不需要改动类的定义。
补充说明
Python的模式匹配对于内置类型(比如list、tuple)会自动支持位置解构,但自定义类需要显式配置__match_args__,或者使用关键字模式——这是为了保证代码的清晰性,避免依赖类的__init__参数顺序(毕竟很多类的__init__参数可能和实例属性不完全对应)。
内容的提问来源于stack exchange,提问作者HelgiBergmann
相关产品推荐
相关产品推荐

