标签: structural-pattern-matching

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

我试图运行文档中的示例,但出现错误:

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)

python python-3.10 structural-pattern-matching

7
推荐指数
1
解决办法
2064
查看次数

Python 结构模式匹配

我无法运行此代码:

match shape:
    case Point(x, y):
        ...
    case Rectangle(x, y, _, _):
        ...
print(x, y)
Run Code Online (Sandbox Code Playgroud)

match在python中找不到关键字,

我在这里找到它:https : //www.python.org/dev/peps/pep-0622/#the-match-statement

...任何的想法??

更新:刚刚看到你的答案,像我这样的新 python 开发人员可能会犯同样的错误,所以我会把这个问题留给可能需要的每个人......谢谢你们,我真的很感谢你们的努力!

python functional-programming python-3.10 structural-pattern-matching

5
推荐指数
2
解决办法
1190
查看次数

如何通过结构模式匹配来表达 hasattr() 鸭子类型逻辑?

我有通过查找属性来检查命名元组数据类_fields的代码:

if hasattr(candidate, '_fields'):
    do_action()
Run Code Online (Sandbox Code Playgroud)

如何使用 Python 3.10 的匹配/大小写结构模式匹配来表达这一点?

python duck-typing python-3.10 structural-pattern-matching

5
推荐指数
1
解决办法
503
查看次数

结构模式匹配 Python - 匹配集合 / Frozenset

我一直在尝试 Python 3.10 中的结构模式匹配,但不知道如何让它匹配一组。例如我尝试过:

a = {1,2,3}

match a:
    case set(1,2,3):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

我尝试过:

a = {1,2,3}

match a:
    case set([1,2,3]):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

也:

a = {1,2,3}

match a:
    case [1,2,3] if isinstance(a, set):
        print('matched')
Run Code Online (Sandbox Code Playgroud)

我猜有一种方法可以做到这一点,因为我们可以匹配其他对象,而我只是缺少正确的语法,但我想不出还有什么可以尝试的。任何帮助,将不胜感激!谢谢!

python structural-pattern-matching

5
推荐指数
1
解决办法
1755
查看次数

如何在数据类中一起使用 match_args 和 kw_args ?

给出以下示例:

from dataclasses import dataclass

@dataclass
class Person:
    name: str = ""


@dataclass(kw_only=True)
class AnotherPerson:
    name: str = ""


print(Person.__match_args__)
print(AnotherPerson.__match_args__)
Run Code Online (Sandbox Code Playgroud)

运行时,您会得到以下信息:

('name',)
()
Run Code Online (Sandbox Code Playgroud)

根据dataclass match_args参数的文档(重点是我的):

match_args:如果为 true(默认为 True),将从生成的 __init__() 方法的参数列表中创建 __match_args__ 元组(即使未生成 __init__(),请参见上文)。如果为 false,或者类中已定义 __match_args__,则不会生成 __match_args__。

鉴于match_args默认值为 true,我认为__match_args__变量应该设置为方法中出现的值__init__,尽管关键字参数的情况似乎并非如此。这只是一个未记录的限制,还是我做错了什么?

__match_args__无论如何,我将如何在不明确写出这些元组的情况下生成它们?

python python-dataclasses python-3.10 structural-pattern-matching

5
推荐指数
1
解决办法
1481
查看次数

结构模式匹配python - 匹配序列中的任何位置

我有一个对象列表,想要检查列表的一部分是否与特定模式匹配。

考虑以下列表:

l1 = ["foo", "bar"]
l2 = [{1, 2},"foo", "bar"]
l3 = ["foo", "bar", 5]
l4 = [{1,2},"foo", "bar", 5, 6]
Run Code Online (Sandbox Code Playgroud)

["foo", "bar"]在所有不同情况下我将如何匹配序列?

我天真的想法是:

match l4:
    case [*_, "foo", "bar", *_]:
        print("matched!")
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是一个SyntaxError: multiple starred names in sequence pattern. 问题是,我不知道有多少元素在该模式的前面和后面。

编辑:我想我需要澄清:"foo", "bar"只是一个更复杂模式的替代品。(我正在使用 AST 对象)

python structural-pattern-matching

5
推荐指数
1
解决办法
914
查看次数

PEP 622 - match 语句可以用作表达式吗?

PEP 622引入了match声明作为if-elif-else. 然而,我在提案或任何在线材料中找不到的一件事是该match声明是否可以用作表达式而不仅仅是作为声明。

举几个例子可以清楚地说明这一点:

示例1:

def make_point_2d(pt):
    match pt:
        case (x, y):
            return Point2d(x, y)
        case _:
            raise TypeError("not a point we support")
Run Code Online (Sandbox Code Playgroud)

示例2:

match response.status:
    case 200:
        do_something(response.data)
    case 301 | 302:
        retry(response.location)
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,函数从子句内部返回case,而在第二个示例中,不返回任何内容。但我希望能够做类似以下假设示例的事情:

spouse = match name:
    case "John":
        "Jane"
    case "David":
        "Alice"
print(spouse)
Run Code Online (Sandbox Code Playgroud)

但它无法编译。

python isinstance python-3.10 structural-pattern-matching

4
推荐指数
1
解决办法
386
查看次数

Python结构模式匹配中如何区分元组和列表?

我想使用Python的结构模式匹配来区分元组(例如代表一个点)和元组列表。

但直接的方法不起作用:

def fn(p):
    match p:
        case (x, y):
            print(f"single point: ({x}, {y})")
        case [*points]:
            print("list of points:")
            for x, y in points:
                print(f"({x}, {y})")

fn((1, 1))
fn([(1, 1), (2, 2)])
Run Code Online (Sandbox Code Playgroud)

其输出:

single point: (1, 1)
single point: ((1, 1), (2, 2))
Run Code Online (Sandbox Code Playgroud)

而我希望它输出:

single point: (1, 1)
list of points:
(1, 1)
(2, 2)
Run Code Online (Sandbox Code Playgroud)

切换 case 语句的顺序在这里也没有帮助。

通过模式匹配解决这个问题的好方法是什么?

python python-3.10 structural-pattern-matching

3
推荐指数
1
解决办法
554
查看次数

用于检查协议的模式匹配。获取类型错误:调用的匹配模式必须是类型

我需要匹配输入可迭代的情况。这是我尝试过的:

from typing import Iterable

def detector(x: Iterable | int | float | None) -> bool:
    match x:
        case Iterable():
            print('Iterable')
            return True
        case _:
            print('Non iterable')
            return False
Run Code Online (Sandbox Code Playgroud)

这会产生这个错误:

TypeError: called match pattern must be a type
Run Code Online (Sandbox Code Playgroud)

是否可以通过匹配/大小写来检测可迭代性?

请注意,这两个问题解决了相同的错误消息,但两个问题都不是关于如何检测可迭代性:

python iterable abc typeerror structural-pattern-matching

3
推荐指数
1
解决办法
816
查看次数