gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:06:12 31 4
gpt4 key购买 nike

我正在尝试运行一个示例 from the docs ,但得到错误:

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")

最佳答案

你需要在你的类中定义 __match_args__。正如 in this section 所指出的那样“3.10 中的新增功能”页面:

You can use positional parameters with some builtin classes thatprovide an ordering for their attributes (e.g. dataclasses). You canalso define a specific position for attributes in patterns by settingthe __match_args__ special attribute in your classes. If it’s set to(“x”, “y”), the following patterns are all equivalent (and all bindthe y attribute to the var variable):

Point(1, var) 
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)

所以你的类(class)需要如下所示:

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 语句中指定其参数。)

有关详细信息,我将向读者推荐 PEP 634 ,这是结构模式匹配的规范。关于这一点的详细信息在 Class Patterns 部分中。 .

为了获得更好的介绍或教程,请不要使用“新增功能”文档,因为它倾向于提供概述,但可能会跳过一些内容。相反,请使用 PEP 636 -- Structural Pattern Matching: Tutorial , 或 match statements 上的语言引用了解更多详情。


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

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")

关于python - Point() 接受 0 个位置子模式(给定 2 个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69627609/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com