<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「case」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/case/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Fri, 30 Jan 2026 22:01:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「case」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】構造的パターンマッチ（match case）の使い方</title>
		<link>https://tech.nkhn37.net/python-structual-pattern-matching-basics/</link>
					<comments>https://tech.nkhn37.net/python-structual-pattern-matching-basics/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Tue, 05 Sep 2023 20:00:00 +0000</pubDate>
				<category><![CDATA[構造的パターンマッチ]]></category>
		<category><![CDATA[case]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[Python 3.10]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=9025</guid>

					<description><![CDATA[Python 3.10 で追加された構造的パターンマッチ（match case）の使い方について解説します。 Python の構造的パターンマッチ Python 3.10 で新しく追加されたものとして「構造的パターンマッ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python 3.10 で追加された<span class="marker"><strong>構造的パターンマッチ（<code>match case</code>）</strong></span>の使い方について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Python の構造的パターンマッチ</h2>



<p class="wp-block-paragraph">Python 3.10 で新しく追加されたものとして「<span class="marker"><strong>構造的パターンマッチ (Structural Pattern Matching</strong></span>)」という機能があります。</p>



<p class="wp-block-paragraph">構造的パターンマッチは、その名の通り評価対象がパターンにマッチするかをチェックして、一致した場合の挙動を定義することができます。構造的パターンマッチは、近年の新機能の中で最も議論を起こした複雑な機能であると言われており、この機能は受理されるまで何度も議論されています。</p>



<p class="wp-block-paragraph">関連する主な PEP 文書である PEP 634、635、636 の文書は以下になります。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--simple-box1  "><div class="c--simple-box-inner">
<ul class="wp-block-list jinr-list">
<li><a href="https://peps.python.org/pep-0634/" target="_blank" rel="noreferrer noopener">PEP 634 – Structural Pattern Matching: Specification</a></li>



<li><a href="https://peps.python.org/pep-0635/" target="_blank" rel="noreferrer noopener">PEP 635 – Structural Pattern Matching: Motivation and Rationale</a></li>



<li><a href="https://peps.python.org/pep-0636/" target="_blank" rel="noreferrer noopener">PEP 636 – Structural Pattern Matching: Tutorial</a></li>
</ul>
</div></div></section>



<p class="wp-block-paragraph">構造的パターンマッチには多くのパターンが PEP 634 で定義されています。本記事では、PEPで定義されているパターンの例を使いつつ、<span class="marker"><strong>構造的パターンマッチの基本的な使い方</strong></span>を紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">構造的パターンマッチの基本的な使い方（<code>match-case</code> 構文）</h3>



<p class="wp-block-paragraph">構造的パターンマッチでは、<span class="marker"><strong><code>match</code></strong></span> と <span class="marker"><strong><code>case</code></strong></span> というソフトキーワードが導入されており、以下の <code>match</code> 文として使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">match expression:
    case pattern:
        ...</pre>



<p class="wp-block-paragraph"><code>expression</code> の部分には Python の式を指定し、<code>pattern</code> の部分にはマッチさせるパターンを指定します。複数パターンの場合は、複数 <code>case</code> を記載していきます。<code>case</code> ブロック内の <code>...</code> 部分にはパターンに一致した場合のコードを記述します。</p>



<p class="wp-block-paragraph"><code>match</code> 文は、C 言語の <code>switch</code> 文に似ていますが、後述するようにシーケンスやクラスのインスタンス内部の値との一致を確認できるなど強力な機能として使用できます。</p>



<p class="wp-block-paragraph">以下は、他のプログラミングでも出てくるような簡単な分岐処理を、<code>match</code> 文で実現した例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">value = 2

match value:
    case 1:
        print("失敗")
    # ↓ ここがマッチする
    case 2:
        print("成功")
    case _:
        print("値は不適切です。")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
成功</pre>



<p class="wp-block-paragraph">上記では <code>value=2</code> なので「<code>case 2:</code>」の部分がマッチして「成功」と表示されます。もし <code>value=1</code> の場合は「失敗」という表示になります。なお、<code>match case</code> では、一番最初にマッチした <code>case</code> 以外の処理は実行されませんので注意しましょう。</p>



<p class="wp-block-paragraph">また、「<code>_</code> (アンダースコア)」は、後述しますがワイルドカードパターン（Wildcard Patterns）で、必ず一致するパターンとして使用できます。上記例では、1 や 2 以外の数値や文字列等の場合には「値は不適切です。」と表示されます。C 言語の <code>switch</code> 文における <code>default</code> のようなものです。</p>



<p class="wp-block-paragraph">上記例は非常に簡単な例として紹介しましたが、Python の構造的パターンマッチのパターンの種類としては多くの種類があり、<a href="https://peps.python.org/pep-0634/" data-type="link" data-id="https://peps.python.org/pep-0634/" target="_blank" rel="noreferrer noopener">PEP 634</a> には「～ Patterns」というように記載があります。以降では、代表的なパターンについて簡単な例を使って紹介してみたいと思います。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox5 ">
			<i class="jif jin-ifont-v2speaker" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">Pythonでは、予約語（keywords）とソフトキーワード（soft keywords）が区別されています。</p>



<p class="wp-block-paragraph">ソフトキーワードは特定の文脈でのみ特別な意味を持ち、それ以外では通常の識別子として使用できます。</p>



<p class="wp-block-paragraph">例えば、<code>match</code> や <code>case</code> は、構造的パターンマッチング（<code>match-case</code> 構文）でのみ特別な意味を持ち、それ以外の文脈では、通常の変数や関数名として使用できます。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">構造的パターンマッチの種類</h3>



<p class="wp-block-paragraph">Python の構造的パターンマッチのパターンについて、例を使って紹介していきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">リテラルパターン（Literal Patterns）</h4>



<p class="wp-block-paragraph">最も基本的な、<code>case</code> の後ろにリテラルを記述するパターンを<span class="marker"><strong>リテラルパターン（Literal Patterns）</strong></span>と言います。リテラルパターンでは、以下のように単純に値が一致するかどうかでマッチングを行います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def check(data):
    match data:
        case 1:
            print("失敗")
        case 2:
            print("成功")
        case _:
            print("値は不適切です。")


if __name__ == "__main__":
    value = 1
    check(value)

    print("---")
    value = 2
    check(value)

    print("---")
    value = 3
    check(value)

    print("---")
    value = "test"
    check(value)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
失敗
---
成功
---
値は不適切です。
---
値は不適切です。</pre>



<p class="wp-block-paragraph">上記例では、<code>1</code> であれば失敗、<code>2</code> であれば成功、その他の場合は不適切な値として処理されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">キャプチャパターン（Capture Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>キャプチャパターン（Capture Patterns）</strong></span>は、<code>case</code> の後ろの変数に値をキャプチャして処理をするパターンです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def check(data):
    match data:
        case 1:
            print("失敗")
        case x:
            print(f"成功: {x}")

    # 以下のような書き方をしてしまうと「case 1:」に到達しない
    # match value:
    #     case x:
    #         print(f"成功: {x}")
    #     case 1:
    #         print("失敗")


if __name__ == "__main__":
    value = 1
    check(value)

    print("---")
    value = 2
    check(value)

    print("---")
    value = 3
    check(value)

    print("---")
    value = "test"
    check(value)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
失敗
---
成功: 2
---
成功: 3
---
成功: test</pre>



<p class="wp-block-paragraph">上記例では「<code>case 1:</code>」の条件に一致しなかった <code>data</code> を、変数 <code>x</code> にキャプチャしています。そのため、<code>print</code> 文では <code>x</code> を使って値を表示できています。</p>



<p class="wp-block-paragraph">キャプチャパターンで注意するべきことは <code>case</code> の順番です。<code>match case</code> では、一番最初にマッチした <code>case</code> 以外の処理は実行されません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # 以下のような書き方をしてしまうと「case 1:」に到達しない
    match value:
        case x:
            print(f"成功: {x}")
        case 1:
            print("失敗")</pre>



<p class="wp-block-paragraph">例でコメントアウトしてある部分のように、<code>case</code> の記載順番を変えて「<code>case x:</code>」を先に記載すると「<code>case 1:</code>」に到達しなくなるので注意してください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ワイルドカードパターン（Wildcard Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>ワイルドカードパターン（Wildcard Patterns）</strong></span>は、<code>case</code> の後ろに「<code>_</code>」を記述して、すべてのパターンをとらえるためのパターンです。既にこれまでの例でも、目的のパターンに一致しないものに対する処理を記述するためにワイルドカードパターンを使用しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def show(data):
    match data:
        case _:
            print(data)


if __name__ == "__main__":
    value = 1
    show(value)

    print("---")
    value = "test"
    show(value)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
1
---
test</pre>



<p class="wp-block-paragraph">上記例は、あまり意味のあるコードではありませんが、数値や文字列でもマッチしていることが分かるかと思います。</p>



<p class="wp-block-paragraph">キャプチャパターンと似ていますが、違いは値をキャプチャしないことです。Python では、<code>for</code> 文など後々不要な値を表現する際に「<code>_</code>」を使いますが、それと同様です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">値パターン（Value Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>値パターン（Value Patterns）</strong></span>は、既に定義されている変数や定数の名前にマッチするパターンです。</p>



<p class="wp-block-paragraph">以下例は、<code>Enum</code> を使った列挙型の値との一致を確認する例になっています。なお、<code>Enum</code> については「<a href="https://tech.nkhn37.net/python-enum-basics/" data-type="link" data-id="https://tech.nkhn37.net/python-enum-basics/" target="_blank" rel="noreferrer noopener">列挙型enumの使い方の基本</a>」も参考にしてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from enum import Enum, auto


class Color(Enum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()
    YELLOW = auto()


def check(target):
    match target:
        case Color.RED:
            print("赤")
        case Color.GREEN:
            print("緑")
        case Color.BLUE:
            print("青")
        case _:
            print("一致はありません")


if __name__ == "__main__":
    color = Color.RED
    check(color)

    print("---")
    color = Color.GREEN
    check(color)

    print("---")
    color = Color.BLUE
    check(color)

    print("---")
    color = Color.YELLOW
    check(color)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
赤
---
緑
---
青
---
一致はありません</pre>



<p class="wp-block-paragraph">上記例では、列挙体である <code>Color</code> クラスの値を使って色の判定をしています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">シーケンスパターン（Sequence Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>シーケンスパターン（Sequence Patterns）</strong></span>は、<code>list</code> や <code>tuple</code> といったシーケンス関連にマッチさせるために使用します。</p>



<p class="wp-block-paragraph">以下の例は、対象の値が <code>3</code> で割り切れるか、<code>5</code> で割り切れるかをリストで表現しつつ、一致の確認を行っている例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def devisible_by_3_5(data):
    sequence = [data % 3, data % 5]
    match sequence:
        case (0, 0):
            print(f"{data}: 3と5で割り切れる")
        case (0, _):
            print(f"{data}: 3で割り切れる")
        case (_, 0):
            print(f"{data}: 5で割り切れる")
        case _:
            print(f"{data}")


if __name__ == "__main__":
    for d in range(1, 16):
        devisible_by_3_5(d)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
1
2
3: 3で割り切れる
4
5: 5で割り切れる
6: 3で割り切れる
7
8
9: 3で割り切れる
10: 5で割り切れる
11
12: 3で割り切れる
13
14
15: 3と5で割り切れる</pre>



<p class="wp-block-paragraph">上記例では、判定の前に「<code>sequence = [data % 3, data % 5]</code>」で、<code>3</code> で割った余りと <code>5</code> で割った余りのリストを作成しています。</p>



<p class="wp-block-paragraph"><code>case</code> 文では、<code>sequence</code> が「<code>(0, 0)</code>」「<code>(0, _)</code>」「<code>(_, 0)</code>」「<code>_</code>」のどの形式にマッチするかを確認しています。「<code>_</code>」については、ワイルドカードパターンなのでどんな値や型でもよい部分です。</p>



<p class="wp-block-paragraph">今回対象の <code>sequence</code> はリストですが、<code>case</code> では「<code>(0, 0)</code>」といったタプルでもマッチさせることができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">マッピングパターン（Mapping Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>マッピングパターン（Mapping Patterns）</strong></span>は、辞書（<code>dict</code>）等のマッピング関連の一致を確認するために使用します。</p>



<p class="wp-block-paragraph">以下は、条件を記載している辞書に対してキーで一致させて、値を表示しているような例になっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def check(target):
    match target:
        case {"cond1": cond1, "cond2": cond2}:
            print(cond1, cond2)
        case {"cond3": cond3, **items}:
            print(cond3)
            print(items)
        case {**items}:
            print(items)
        case _:
            print("対象外")


if __name__ == "__main__":
    data = {"cond1": 10, "cond2": 20}
    check(data)

    print("---")
    data = {"cond3": 30, "cond4": 40, "cond5": 50}
    check(data)

    print("---")
    data = {"cond6": 60, "cond7": 70}
    check(data)

    print("---")
    data = [1, 2, 3, 4, 5]
    check(data)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
10 20
---
30
{'cond4': 40, 'cond5': 50}
---
{'cond6': 60, 'cond7': 70}
---
対象外</pre>



<p class="wp-block-paragraph">上記例では、 <code>"cond1"</code> や <code>"cond2"</code> といったキーで一致を確認しています。<code>case</code> でキーが一致した場合には、<code>cond1</code> や <code>cond2</code>といった変数に値がキャプチャされます。</p>



<p class="wp-block-paragraph">「<code>case {"cond3": cond3, **items}:</code>」という部分では、「<code>**items</code>」という表現を使っています。これは関数やメソッドでキーワード引数をまとめて受け取る <code>**kwargs</code> の考え方と同じでその他の項目をキャプチャします。<code>"cond3"</code> が一致する場合は、<code>cond3</code> に値をキャプチャしつつ、その他の項目は <code>items</code> にキャプチャされます。同様に「<code>case {**items}:</code>」としている部分では、それよりも上の <code>case</code> で一致しなかった辞書が全て <code>items</code> にキャプチャされます。</p>



<p class="wp-block-paragraph">ワイルドカードパターンについては、辞書以外が指定されてきた場合の処理を記載するために使用できます。設定やデータなどが辞書で条件の一致を確認したいとき等に使用すると便利な場合があります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">クラスパターン（Class Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>クラスパターン（Class Patterns）</strong></span>は、クラスのオブジェクトに対して、その属性で一致を確認するパターンです。</p>



<p class="wp-block-paragraph">以下例では、<code>Point</code> という2次元の位置を表すデータクラスを用意して、値で一致を確認する例を紹介します。なお、データクラスの定義に便利な <code>@dataclass</code> デコレータを使用しています。<code>@dataclass</code> デコレータについては「<a href="https://tech.nkhn37.net/python-dataclass-basics/" data-type="link" data-id="https://tech.nkhn37.net/python-dataclass-basics/" target="_blank" rel="noreferrer noopener">dataclassの使い方の基本</a>」を参考にしてください。</p>



<h5 class="wp-block-heading jinr-heading d--bold">キーワード引数でパターンマッチ (dataclass)</h5>



<p class="wp-block-paragraph">以下は、<code>Point</code> クラスのインスタンスの一致をキーワード引数を使ってマッチングする例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from dataclasses import dataclass


@dataclass
class Point:
    """位置クラス"""

    x: int
    y: int


def where_is(point):
    match point:
        case Point(x=0, y=0):
            print(f"原点: {point}")
        case Point(x=0, y=y):
            print(f"Y={y}: {point}")
        case Point(x=x, y=0):
            print(f"X={x}: {point}")
        case Point():
            print(point)
        case _:
            print("Pointではない")


if __name__ == "__main__":
    pt1 = Point(0, 0)
    where_is(pt1)

    print("---")
    pt2 = Point(0, 5)
    where_is(pt2)

    print("---")
    pt3 = Point(5, 0)
    where_is(pt3)

    print("---")
    pt4 = Point(10, 10)
    where_is(pt4)

    print("---")
    pt5 = (20, 20)
    where_is(pt5)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
原点: Point(x=0, y=0)
---
Y=5: Point(x=0, y=5)
---
X=5: Point(x=5, y=0)
---
Point(x=10, y=10)
---
Pointではない</pre>



<p class="wp-block-paragraph">上記例では、<code>Point</code> クラスのインスタンスの内部まで構造の一致を確認していて、様々なことが起こっています。<code>case</code> の部分を表に整理してみます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>case</th><th>一致する内容</th></tr></thead><tbody><tr><td><code>case Point(x=0, y=0):</code></td><td><code>Point</code> クラスのインスタンスであり、かつ、<code>x=0</code>, <code>y=0</code> である場合。</td></tr><tr><td><code>case Point(x=0, y=y):</code></td><td><code>Point</code> クラスのインスタンス かつ <code>x=0</code> である場合。<code>y</code> の値は変数 <code>y</code> にキャプチャされる。</td></tr><tr><td><code>case Point(x=x, y=0):</code></td><td><code>Point</code> クラスのインスタンス かつ <code>y=0</code> である場合。<code>x</code> の値は変数 <code>x</code> にキャプチャされる。</td></tr><tr><td><code>case Point():</code></td><td><code>Point</code> クラスのインスタンスである場合。</td></tr><tr><td><code>case _:</code></td><td>その他で常にマッチするワイルドカードパターン</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">クラスパターンでは、上記で紹介したようないくつかのパターンが混ざって動作をしています。インスタンス内の属性の値でマッチをとりつつ、必要に応じて変数に値をキャプチャしています。最後にはワイルドカードパターンも使っています。</p>



<p class="wp-block-paragraph"><code>Point(x=0, y=0)</code> といった記載はコンストラクタ呼び出しをイメージする方が多いかと思いますが、<code>case</code> で指定される場合はコンストラクタが呼び出されることはありません。ここは少し混乱する部分かもしれませんので注意しましょう。</p>



<h5 class="wp-block-heading jinr-heading d--bold">位置引数でパターンマッチ (dataclass)</h5>



<p class="wp-block-paragraph">上記でキーワード引数の形式で一致を見てきましたが、位置引数の形式で「<code>case Point(0, 0):</code>」「<code>case Point(0, y):</code>」「<code>case Point(x, 0):</code>」というように指定することも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def where_is(point):
    match point:
        case Point(0, 0):
            print(f"原点: {point}")
        case Point(0, y):
            print(f"Y={y}: {point}")
        case Point(x, 0):
            print(f"X={x}: {point}")
        case Point():
            print(point)
        case _:
            print("Pointではない")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
原点: Point(x=0, y=0)
---
Y=5: Point(x=0, y=5)
---
X=5: Point(x=5, y=0)
---
Point(x=10, y=10)
---
Pointではない</pre>



<p class="wp-block-paragraph">ただし、位置引数を使用する場合は注意が必要です。位置引数の形式を使うには、クラスに<span class="marker"><strong><code>__match_args__</code></strong></span>の定義が必要になります。</p>



<p class="wp-block-paragraph">上記の <code>@dataclass</code> デコレータを使った例では、データクラスでは <code>__match_args__</code>がデフォルトで自動作成されます。そのため、特に意識することなく位置引数の形式で使用できています。</p>



<p class="wp-block-paragraph">コンストラクタなどを含めて自分で定義する場合には、以下のように <code>__match_args__</code> を明示的に定義する必要があるので注意しましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Point:
    """位置クラス"""

    # 属性の順序を__match_args__に追加する必要がある
    __match_args__ = ("x", "y")

    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"</pre>



<h4 class="wp-block-heading jinr-heading d--bold">ASパターン（AS Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>ASパターン（AS Patterns）</strong></span>は、<code>case</code> で一致した際に、<code>as</code> で指定した変数に対象を束縛することができるパターンです。</p>



<p class="wp-block-paragraph">以下は、シーケンスパターンとクラスパターンを組み合わせつつ、変数にクラスのインスタンスを束縛する例となっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from dataclasses import dataclass


@dataclass
class Point:
    """位置クラス"""

    x: int
    y: int


def show(points):
    match points:
        case (Point() as p1, Point() as p2):
            print(p1)
            print(p2)
        case _:
            print("対象外")


if __name__ == "__main__":
    target = [Point(0, 0), Point(10, 10)]
    show(target)

    print("---")
    target = Point(20, 20)
    show(target)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Point(x=0, y=0)
Point(x=10, y=10)
---
対象外</pre>



<p class="wp-block-paragraph">上記例では、「<code>case (Point() as p1, Point() as p2):</code>」の部分で、<code>Point</code> クラスのインスタンスを 2 つ含むリストの一致を確認することができます。一致した場合には、リストの要素をそれぞれ <code>p1</code>、<code>p2</code> に束縛します。その後の <code>print</code> で、<code>p1</code> や <code>p2</code> を表示できていることが分かるかと思います。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ORパターン（OR Patterns）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>ORパターン（OR Patterns）</strong></span>は、<code>case</code> の中で複数条件の OR で一致をさせることができるパターンで、「<code>|</code>」で条件をつなげることができます。</p>



<p class="wp-block-paragraph">分かりやすい例としては、以下のように HTTP レスポンスのパターンを振り分けるような例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def check_status(status):
    match status:
        case 200:
            print("OK")
        case 500 | 501 | 502:
            print("サーバーエラー")
        case _:
            print("対象外")


if __name__ == "__main__":
    response = 200
    check_status(response)

    print("---")
    response = 500
    check_status(response)

    print("---")
    response = 501
    check_status(response)

    print("---")
    response = 502
    check_status(response)

    print("---")
    response = 400
    check_status(response)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
OK
---
サーバーエラー
---
サーバーエラー
---
サーバーエラー
---
対象外</pre>



<p class="wp-block-paragraph">HTTP レスポンスでは、200 はリクエストが成功したことを表します。一方で、500、501、&#8230; といった 500 番台はサーバーエラーに関するレスポンスです。</p>



<p class="wp-block-paragraph">サーバーエラーはまとめて同様の処理としたいような場合等には「<code>case 500 | 501 | 502:</code>」といったように列挙できます。この例はリテラルパターンと OR パターンの組み合わせですが、他のパターンと OR パターンを組み合わせももちろん可能です。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python 3.10で追加された<span class="marker"><strong>構造的パターンマッチ（<code>match case</code>）</strong></span>の使い方について解説しました。</p>



<p class="wp-block-paragraph">構造的パターンマッチは、その名の通り評価対象がパターンにマッチするかをチェックして、一致した場合の挙動を定義することができます。<a href="https://peps.python.org/pep-0634/" data-type="link" data-id="https://peps.python.org/pep-0634/" target="_blank" rel="noreferrer noopener">PEP 634</a> では「～ Patterns」というようにいくつかのパターンが定義されており、本記事では主要なパターンに関して例を使って紹介しました。</p>



<p class="wp-block-paragraph">構造的パターンマッチを使わなくても <code>if</code> 文で条件分岐を書くことはもちろん可能ですが、構造的パターンマッチの <code>match</code> 文をうまく使いこなすと非常に可読性高いコードが書けるようになります。</p>



<p class="wp-block-paragraph">しかし、上記で触れたように構造的パターンマッチには多岐にわたる使い方が存在し、比較的複雑な側面があります。そのため、十分な理解なしに使用すると意図しない挙動やバグを引き起こすリスクも考えられます。使用する際には、システム要件や状況を十分に検討し、適切に利用するようにしましょう。</p>



<p class="wp-block-paragraph">より詳細な情報や背景については、構造的パターンマッチの主な PEP 文書であるPEP634、635、636の文書を参照してください。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--simple-box1  "><div class="c--simple-box-inner">
<ul class="wp-block-list jinr-list">
<li><a href="https://peps.python.org/pep-0634/" target="_blank" rel="noreferrer noopener">PEP 634 – Structural Pattern Matching: Specification</a></li>



<li><a href="https://peps.python.org/pep-0635/" target="_blank" rel="noreferrer noopener">PEP 635 – Structural Pattern Matching: Motivation and Rationale</a></li>



<li><a href="https://peps.python.org/pep-0636/" target="_blank" rel="noreferrer noopener">PEP 636 – Structural Pattern Matching: Tutorial</a></li>
</ul>
</div></div></section>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">構造的パターンマッチに関する公式ドキュメントは<a href="https://docs.python.org/ja/3/reference/compound_stmts.html#the-match-statement" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/match" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-structual-pattern-matching-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-14 06:18:45 by W3 Total Cache
-->