提问人:HelgiBergmann 提问时间:10/19/2021 最后编辑:jonrsharpeHelgiBergmann 更新时间:10/19/2021 访问量:1728
Point() 接受 0 个位置子模式(给定 2 个)
Point() accepts 0 positional sub-patterns (2 given)
问:
我正在尝试从文档中运行一个示例,但出现错误:
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")
答:
11赞
9769953
10/19/2021
#1
您需要在类中定义。如“3.10 中的新增功能”页面的这一部分所述:__match_args__
您可以将位置参数与一些内置类一起使用,这些类 为其属性(例如数据类)提供排序。您可以 还可以通过设置 类中的特殊属性。如果设置为 (“x”, “y”),以下模式都是等价的(并且都绑定 var 变量的 y 属性):
__match_args__
Point(1, var) Point(1, y=var) Point(x=1, y=var) Point(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")
(请注意,您不需要两者兼而有之:具有 defined 的类不需要在 match-case 语句中指定其参数。__match_args__
有关完整的详细信息,我将向读者推荐 PEP 634,这是结构模式匹配的规范。有关此特定点的详细信息,请参阅“类模式”部分。
为了获得更好的介绍或教程,请不要使用“新增功能”文档,因为它往往会提供概述,但可能会跳过一些内容。相反,请使用 PEP 636 -- Structural Pattern Matching: Tutorial 或 match 语句中的语言参考来了解更多详细信息。
在引用的文本中提到,数据类已经具有排序,并且在您的示例中,数据类也可以正常工作:
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")
评论
0赞
aneroid
10/19/2021
好找。文档应该包含一个更好的示例,说明何时匹配位置参数。实际上,从示例中复制粘贴将失败,就像对 OP 一样。Point
__match_args__
0赞
9769953
10/19/2021
@aneroid没错,但我认为现在更好的文档可以在 PEP 636 -- Structural Pattern Matching: Tutorial 或 match 语句的语言参考中找到。“新增功能”往往只提供快速概述,因此会跳过一些内容。
0赞
aneroid
10/19/2021
很公平。但我认为这让参考文档的人感到困惑,因为现在他们必须阅读 PEP 并跟踪它,如果它将来发生变化,则该功能属于哪个 Python 版本。最好让文档只有一行,然后“去阅读 PEP 636”。因此,相关信息是一个地方。当然,你的答案仍然是正确的:-)
评论
if