Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/test/test_dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -3401,7 +3401,7 @@ class C:
self.assertEqual(C(42).__match_args__, ('a',))

def test_explicit_match_args(self):
ma = []
ma = ()
@dataclass
class C:
a: int
Expand Down
30 changes: 23 additions & 7 deletions Lib/test/test_patma.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def no_perf(f):
class MyClass:
x: int
y: str
__match_args__ = ["x", "y"]
__match_args__ = ("x", "y")


@dataclasses.dataclass
Expand Down Expand Up @@ -2018,7 +2018,7 @@ def f(color):

def test_patma_200(self):
class Class:
__match_args__ = ["a", "b"]
__match_args__ = ("a", "b")
c = Class()
c.a = 0
c.b = 1
Expand Down Expand Up @@ -2046,7 +2046,7 @@ def test_patma_202(self):
class Parent:
__match_args__ = "a", "b"
class Child(Parent):
__match_args__ = ["c", "d"]
__match_args__ = ("c", "d")
c = Child()
c.a = 0
c.b = 1
Expand Down Expand Up @@ -2500,7 +2500,7 @@ class Class:
@no_perf
def test_patma_248(self):
class Class:
__match_args__ = [None]
__match_args__ = (None,)
x = Class()
y = z = None
with self.assertRaises(TypeError):
Expand All @@ -2513,7 +2513,7 @@ class Class:
@no_perf
def test_patma_249(self):
class Class:
__match_args__ = []
__match_args__ = ()
x = Class()
y = z = None
with self.assertRaises(TypeError):
Expand Down Expand Up @@ -2560,7 +2560,7 @@ class Keys:
@no_perf
def test_patma_253(self):
class Class:
__match_args__ = ["a", "a"]
__match_args__ = ("a", "a")
a = None
x = Class()
w = y = z = None
Expand All @@ -2575,7 +2575,7 @@ class Class:
@no_perf
def test_patma_254(self):
class Class:
__match_args__ = ["a"]
__match_args__ = ("a",)
a = None
x = Class()
w = y = z = None
Expand Down Expand Up @@ -2841,6 +2841,22 @@ def test_patma_281(self):
self.assertEqual(x, range(10))
self.assertIs(y, None)

@no_perf
def test_patma_282(self):
class Class:
__match_args__ = ["spam", "eggs"]
spam = 0
eggs = 1
x = Class()
w = y = z = None
with self.assertRaises(TypeError):
match x:
case Class(y, z):
w = 0
self.assertIs(w, None)
self.assertIs(y, None)
self.assertIs(z, None)


class PerfPatma(TestPatma):

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:data:`~object.__match_args__` is no longer allowed to be a list.
9 changes: 1 addition & 8 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,15 +1029,8 @@ match_class(PyThreadState *tstate, PyObject *subject, PyObject *type,
int match_self = 0;
match_args = PyObject_GetAttrString(type, "__match_args__");
if (match_args) {
if (PyList_CheckExact(match_args)) {
Py_SETREF(match_args, PyList_AsTuple(match_args));
}
if (match_args == NULL) {
goto fail;
}
if (!PyTuple_CheckExact(match_args)) {
const char *e = "%s.__match_args__ must be a list or tuple "
"(got %s)";
const char *e = "%s.__match_args__ must be a tuple (got %s)";
_PyErr_Format(tstate, PyExc_TypeError, e,
((PyTypeObject *)type)->tp_name,
Py_TYPE(match_args)->tp_name);
Expand Down