首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Point()接受0个位置子模式(2给定)

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

Stack Overflow用户
提问于 2021-10-19 08:39:07
回答 1查看 843关注 0票数 3

我试图运行一个示例从医生那里,但是得到了错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: Point() accepts 0 positional sub-patterns (2 given)

有人能解释我在这里做错了什么吗?

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

因此,您的课程需要如下所示:

代码语言:javascript
复制
class Point:                                                                                            
    __match_args__ = ("x", "y")                                                                         
    def __init__(self, x, y):                                                                           
        self.x = x                                                                                      
        self.y = y                                                                                      

或者,可以将匹配结构更改为:

代码语言:javascript
复制
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也可以正常工作:

代码语言:javascript
复制
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")                                                                   
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69627609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档