我试图运行文档中的示例,但出现错误:
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) 我无法运行此代码:
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
我有通过查找属性来检查命名元组和数据类_fields的代码:
if hasattr(candidate, '_fields'):
do_action()
Run Code Online (Sandbox Code Playgroud)
如何使用 Python 3.10 的匹配/大小写结构模式匹配来表达这一点?
我一直在尝试 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)
我猜有一种方法可以做到这一点,因为我们可以匹配其他对象,而我只是缺少正确的语法,但我想不出还有什么可以尝试的。任何帮助,将不胜感激!谢谢!
给出以下示例:
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
我有一个对象列表,想要检查列表的一部分是否与特定模式匹配。
考虑以下列表:
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 对象)
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的结构模式匹配来区分元组(例如代表一个点)和元组列表。
但直接的方法不起作用:
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 语句的顺序在这里也没有帮助。
通过模式匹配解决这个问题的好方法是什么?
我需要匹配输入可迭代的情况。这是我尝试过的:
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 ×9
structural-pattern-matching ×9
python-3.10 ×6
abc ×1
duck-typing ×1
isinstance ×1
iterable ×1
typeerror ×1