Hel*_*ann 7 python python-3.10 structural-pattern-matching
我试图运行文档中的示例,但出现错误:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: Point() accepts 0 positional sub-patterns (2 given)
Run Code Online (Sandbox Code Playgroud)
有人可以解释我在这里做错了什么吗?
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, y) if x == y:
print(f"Y=X at {x}")
case Point(x, y):
print(f"Not on the diagonal")
Run Code Online (Sandbox Code Playgroud)
0 0*_*0 0 14
您需要__match_args__在班级中定义。正如“3.10 中的新增功能”页面的本节中所指出的:
\n\n您可以将位置参数与一些为其属性(例如数据类)提供排序的内置类一起使用。
\n__match_args__您还可以通过在类中设置特殊属性\n来定义模式中属性的特定位置。如果将\xe2\x80\x99s设置为\n(\xe2\x80\x9cx\xe2\x80\x9d, \xe2\x80\x9cy\xe2\x80\x9d),则以下模式都是等效的(并且所有绑定\nvar 变量的 y 属性):Run Code Online (Sandbox Code Playgroud)\nPoint(1, var) \nPoint(1, y=var) \nPoint(x=1, y=var) \nPoint(y=var, x=1)\n
所以你的类需要如下所示:
\nclass Point: \n __match_args__ = ("x", "y") \n def __init__(self, x, y): \n self.x = x \n self.y = y \nRun Code Online (Sandbox Code Playgroud)\n或者,您可以将匹配结构更改为以下内容:
\nmatch point: \n case Point(x=x, y=y) if x == y: \n print(f"Y=X at {x}") \n case Point(x=x, y=y): \n print(f"Not on the diagonal") \nRun Code Online (Sandbox Code Playgroud)\n(请注意,您不需要两者:已__match_args__定义的类不需要在匹配大小写语句中指定其参数。)
有关完整详细信息,我将建议读者参阅PEP 634,这是结构模式匹配的规范。有关这一点的详细信息请参见“类模式”部分。
\n为了获得更好的介绍或教程,不要使用“新增内容”文档,因为它往往提供概述,但可能会跳过一些内容。相反,请使用PEP 636 -- 结构模式匹配:教程或匹配语句的语言参考以获取更多详细信息。
\n在引用的文本中提到数据类已经有一个排序,并且在您的示例中,数据类也可以正常工作:
\nfrom dataclasses import dataclass \n \n@dataclass \nclass Point: \n x: int \n y: int \n \nx, y = 5, 5 \npoint = Point(x, y) \n \nmatch point: \n case Point(x, y) if x == y: \n print(f"Y=X at {x}") \n case Point(x, y): \n print(f"Not on the diagonal") \nRun Code Online (Sandbox Code Playgroud)\n