我试图运行一个示例从医生那里,但是得到了错误:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: Point() accepts 0 positional sub-patterns (2 given)有人能解释我在这里做错了什么吗?
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")发布于 2021-10-19 09:04:29
您需要在类中定义__match_args__。正如在本节中在“3.10中的新内容”页面中指出的那样:
您可以将位置参数与一些内置类一起使用,这些类为它们的属性提供排序(例如,数据类型)。还可以通过在类中设置
__match_args__特殊属性来定义模式中属性的特定位置。如果将其设置为(“x”,“y”),则以下模式都是等效的(并且都将y属性绑定到var变量): 点(1,var)点(1,y=var)点(x=1,y=var)点(y=var,x=1)
因此,您的课程需要如下所示:
class Point:
__match_args__ = ("x", "y")
def __init__(self, x, y):
self.x = x
self.y = 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") (请注意,您不需要两个:定义了__match_args__的类,不需要在match-case语句中指定它的参数。)
有关详细信息,我将参考佩普634,这是结构模式匹配的规范。关于这一点的详细信息见类模式一节。
为了获得更好的介绍或教程,不要使用“什么是新的”文档,因为它往往提供一个概述,但可能跳过一些事情。相反,可以使用PEP 636 --结构模式匹配:教程或匹配语句上的语言引用来了解更多细节。
引用的文本中提到,dataclass已经有一个排序,在您的示例中,dataclass也可以正常工作:
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
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") https://stackoverflow.com/questions/69627609
复制相似问题