Skip to content

Support match case destructuring in Python 3.10 using __match_args__ #814

@tirkarthi

Description

@tirkarthi

In Python 3.10 match/case syntax was added that also has destructuring syntax. dataclass supports this feature and has option to disable this. The current logic is at https://github.com/python/cpython/blob/366c69f3f63a2a1cce57dabe8f7c2e67d1df625d/Lib/dataclasses.py#L374 where init and kw_only are checked.

dataclass had some discussion and added support where __match_args__ generation can be disabled if needed : https://bugs.python.org/issue43764

I have a patch locally working. I can write some tests. But I will be happy to know if a PR is accepted and if an option to disable matching is needed like dataclasses.

attrs

# /tmp/attrs_match.py    
import attr

@attr.s
class AttrPerson:
    name = attr.ib()

person = AttrPerson(name="Kate")

match person:
    case AttrPerson(name):
        print(f"Found {name}")
    case _:
        print("Not found")
python /tmp/attrs_match.py
Traceback (most recent call last):
  File "/tmp/attrs_match.py", line 10, in <module>
    case AttrPerson(name):
TypeError: AttrPerson() accepts 0 positional sub-patterns (1 given)

Dataclasses

# /tmp/dataclass_match.py 
from dataclasses import dataclass

@dataclass
class Person:
    name: str

    
person = Person(name="Kate")

match person:
    case Person(name):
        print(f"Found {name}")
    case _:
        print("Not found")
$ python /tmp/dataclass_match.py 
Found Kate

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions