Point() 接受 0 个位置子模式(给定 2 个)

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

您可以将位置参数与一些为其属性(例如数据类)提供排序的内置类一起使用。__match_args__您还可以通过在类中设置特殊属性\n来定义模式中属性的特定位置。如果将\xe2\x80\x99s设置为\n(\xe2\x80\x9cx\xe2\x80\x9d, \xe2\x80\x9cy\xe2\x80\x9d),则以下模式都是等效的(并且所有绑定\nvar 变量的 y 属性):

\n
Point(1, var) \nPoint(1, y=var) \nPoint(x=1, y=var) \nPoint(y=var, x=1)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

所以你的类需要如下所示:

\n
class Point:                                                                                            \n    __match_args__ = ("x", "y")                                                                         \n    def __init__(self, x, y):                                                                           \n        self.x = x                                                                                      \n        self.y = y                                                                                      \n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可以将匹配结构更改为以下内容:

\n
match 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")                                                                   \n
Run Code Online (Sandbox Code Playgroud)\n

(请注意,您不需要两者:已__match_args__定义的类不需要在匹配大小写语句中指定其参数。)

\n

有关完整详细信息,我将建议读者参阅PEP 634,这是结构模式匹配的规范。有关这一点的详细信息请参见“类模式”部分。

\n

为了获得更好的介绍或教程,不要使用“新增内容”文档,因为它往往提供概述,但可能会跳过一些内容。相反,请使用PEP 636 -- 结构模式匹配:教程匹配语句的语言参考以获取更多详细信息。

\n
\n

在引用的文本中提到数据类已经有一个排序,并且在您的示例中,数据类也可以正常工作:

\n
from 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")                                                                   \n
Run Code Online (Sandbox Code Playgroud)\n