You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:37:53