<?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>Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sat, 14 Mar 2026 22:06:32 +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>Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pythonの主な新機能まとめ｜バージョンごとの変更の要点を解説</title>
		<link>https://tech.nkhn37.net/python-version-changes/</link>
					<comments>https://tech.nkhn37.net/python-version-changes/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[Python入門]]></category>
		<category><![CDATA[Pythonバージョン]]></category>
		<category><![CDATA[Python変更点]]></category>
		<category><![CDATA[Python新機能]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=14072</guid>

					<description><![CDATA[Python は継続的に進化しています。この記事では Python 各バージョンの主な新機能・変更点の要点をまとめて解説します。 はじめに Python は、定期的に新バージョンがリリースされ、文法の追加や標準ライブラリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python は継続的に進化しています。この記事では <span class="jinr-d--text-color d--marker1 d--bold">Python 各バージョンの主な新機能・変更点の要点</span>をまとめて解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">はじめに</h2>



<p class="wp-block-paragraph">Python は、定期的に新バージョンがリリースされ、文法の追加や標準ライブラリの拡張、パフォーマンスの改善など、様々な変更が行われています。新しい機能が追加されることで、より簡潔で読みやすいコードが書けるようになったり、開発効率が向上したりといったことも少なくありません。</p>



<p class="wp-block-paragraph">Python の変更点は、公式ドキュメントのリリースノートから確認できます。しかし、すべてを把握するのは容易ではありません。</p>



<p class="wp-block-paragraph">そこで、この記事では、<span class="jinr-d--text-color d--marker1 d--bold">Python 3.10 以降のバージョンを対象に、特に重要と考えられる新機能や変更点を中心に要点を整理</span>して紹介します。なお、すべての変更点を網羅するものではなく、筆者が重要だと考えるものを優先して取り上げています。</p>



<p class="wp-block-paragraph">より詳細には<a href="https://docs.python.org/ja/3/" target="_blank" rel="noreferrer noopener">公式ドキュメント</a>の各バージョンにおける「What&#8217;s new in Python X.X?」というリンクを参照してください。</p>



<p class="wp-block-paragraph">また、各機能の詳細については、本サイトで個別記事として解説しているものもあるため、必要に応じて関連記事へのリンクも掲載しています。</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">記事初回公開時点で EOL (End of Life) となっている Python 3.9 以前のバージョンは、この記事では扱っていません。3.10 以降のバージョンについては、今後 EOL になった場合でも削除せず、本記事の履歴として残す予定です。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">Python 各バージョンの主な新機能・変更点</h2>



<h3 class="wp-block-heading jinr-heading d--bold">Python 3.14</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://docs.python.org/ja/3.14/whatsnew/3.14.html" target="_blank" rel="noreferrer noopener">Python 3.14</a></span> では、型注釈の仕組みや並列処理に関する改善など、言語仕様に関わる変更がいくつか導入されています。また、文字列機能（t-string）や圧縮ライブラリ（<code>zstd</code>）など、開発者の利便性を高める文法や標準ライブラリ拡張も行われています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">型注釈の遅延評価</h4>



<p class="wp-block-paragraph">型注釈の評価モデルが変更され、<strong>遅延評価の仕組み</strong>が導入されました。これにより、型注釈は、必要なタイミングで評価されるようになりました。</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"><strong>【遅延評価とは】</strong></p>



<p class="wp-block-paragraph">遅延評価とは、式や関数の評価を、実際に必要になるまで先送りする最適化方法です。これにより、不要な計算を回避できたり、無限データを扱えたりといったメリットがあります。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">フリースレッドな Python（改善）</h4>



<p class="wp-block-paragraph">Python 3.13 で実験的に導入された<strong>フリースレッドな Python の改善</strong>が進められました。フリースレッドな Python では、従来の GIL (Global Interpreter Lock) に依存しない実行モデルが検討されており、マルチスレッド環境での並列処理性能の向上が期待されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">テンプレート文字列（t-string）</h4>



<p class="wp-block-paragraph">新しい文字列機能としてテンプレート文字列（t-string）が文法に導入されました。これは、文字列のテンプレート処理を安全かつ柔軟に扱うための仕組みで「文字列化されていないテンプレート」という概念を Python 標準の文法として取り入れています。</p>



<p class="wp-block-paragraph">f-string は、文字列として即時評価されますが、t-string は後から評価・処理できるため、安全な文字列処理を実現するための実装に役立ちます。</p>



<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">t-string については「<a href="https://tech.nkhn37.net/python-t-string-basic/" target="_blank" rel="noreferrer noopener">テンプレート文字列 t-string の使い方</a>」を参考にしてください。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">Zstandard（<code>zstd</code>）の標準ライブラリ化</h4>



<p class="wp-block-paragraph"><strong>Zstandard</strong> は、Meta（旧 Facebook）が開発した高速で高圧縮な圧縮アルゴリズムです。Python 3.13 以前でも、外部ライブラリで使用できましたが、Python 3.14 で標準ライブラリ（<strong><code>zstd</code></strong>）として取り込まれました。</p>



<p class="wp-block-paragraph">これにより、外部ライブラリに依存しない形で、高速かつ高圧縮な Zstandard のデータ圧縮を扱えるようになりました。</p>



<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"><code>zstd</code> については「<a href="https://tech.nkhn37.net/python-zstd-basic/" target="_blank" rel="noreferrer noopener">zstd によりデータを圧縮／解凍する基本</a>」を参考にしてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">Python 3.13</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://docs.python.org/ja/3.13/whatsnew/3.13.html" target="_blank" rel="noreferrer noopener">Python 3.13</a></span> では、Python の実行モデルや開発体験に関わる改善が導入されています。特に、並列処理や実行速度の向上を目指した実験的な機能が追加されている点が特徴的です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">フリースレッドな Python（実験）</h4>



<p class="wp-block-paragraph">「<strong>フリースレッドな Python</strong>」が実験的な機能として導入されました。従来の Python では、マルチスレッドの並列処理では、GIL (Global Interpreter Lock) により制限を受けていました。</p>



<p class="wp-block-paragraph">フリースレッドな Python は、GIL を使わない実行モデルであり、試験的に導入されました。この機能により、将来的には、Python でも効率的なマルチスレッド処理が可能になると期待されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">JIT (Just-In-Time) コンパイラ（実験）</h4>



<p class="wp-block-paragraph">プログラム実行時にコードをコンパイルして最適化する「<strong>JIT (Just-In-Time) コンパイラ</strong>」が実験的な機能として導入されました。JITは、プログラム実行時にコードを機械語へ変換・最適化することで、処理のパフォーマンス向上が期待されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">REPL 改善</h4>



<p class="wp-block-paragraph">インタラクティブな実行環境（REPL）が大きく改善されています。表示機能などが強化され、Python を対話的に利用する際の操作性が向上しました。</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"><strong>【REPL とは】</strong></p>



<p class="wp-block-paragraph">REPL は、R (Read：読み込み)、E (Evaluate：評価)、P (Print：表示)、L (Loop：ループ) のことで、Python の対話型実行環境のことを言います。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">Python 3.12</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://docs.python.org/ja/3.12/whatsnew/3.12.html" target="_blank" rel="noreferrer noopener">Python 3.12</a></span> では、文字列機能強化や標準ライブラリの整理など、言語仕様や開発環境を整えるための変更が行われました。</p>



<h4 class="wp-block-heading jinr-heading d--bold">f-string 文法の拡張</h4>



<p class="wp-block-paragraph"><strong>f-string の使い方の制限がいくつか解除</strong>され、より柔軟に式を記述できるようになりました。例えば、「f-string を囲むクォートと同じクォートを文字列中で再利用できるようになった」などがあります。</p>



<p class="wp-block-paragraph">これにより、従来制限されていた複雑な式や改行を含む表現なども f-string 内で扱えるようになっています。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>distutils</code> 削除</h4>



<p class="wp-block-paragraph">Python パッケージを作成・配布するためのツールとして、長年非推奨となっていた <strong><code>distutils</code> モジュールが正式に削除</strong>されました。現在では、<code>setuptools</code> が事実上デファクトスタンダードの位置づけとなっています。</p>



<p class="wp-block-paragraph"><code>distutils</code> の機能は、<code>setuptools</code> に取り込まれているため、3.12 以降で <code>distutils</code> が必要な場合でも、<code>setuptools</code> に含まれる互換実装を利用できます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">サブインタープリタ（インタープリタごとの GIL）</h4>



<p class="wp-block-paragraph"><strong>サブインタープリタごとに独立した GIL</strong> を持つ仕組み（Per-interpreter GIL）の実装が進められました。これは、将来的な並列処理改善に向けた重要な基盤です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Python 3.11</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://docs.python.org/ja/3.11/whatsnew/3.11.html" target="_blank" rel="noreferrer noopener">Python 3.11</a></span> では、Python の大幅なパフォーマンス改善が注目されました。実行速度の向上に加えて例外処理や標準ライブラリにも変更が加えられています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">実行速度の大幅改善</h4>



<p class="wp-block-paragraph">インタープリタの内部最適化などが進められ、<strong>実行速度が大幅に改善</strong>されました。3.11 のリリースノートでは「Python 3.10 とくらべて 10-60% 高速」「平均的には、標準ベンチマークスイートでは 1.25倍の高速化を計測」と記載があり、大きな性能向上が確認されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">例外グループ / <code>except*</code></h4>



<p class="wp-block-paragraph">複数の例外をまとめて扱うための<strong>例外グループ（ExceptionGroup）</strong>が導入されました。これにより例外をグループ化してまとめて送出できるようになりました。</p>



<p class="wp-block-paragraph">また、対応する構文として「<code><strong>except*</strong></code>」が追加されており、例外グループの中に指定した型の例外が含まれている場合、その例外だけを取り出して処理することができるようになりました。</p>



<p class="wp-block-paragraph">例外グループにより、並列処理などで複数例外が発生する場合に、処理が行いやすくなっています。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>tomllib</code> 標準ライブラリ化</h4>



<p class="wp-block-paragraph">TOML ファイルを読み込むための <strong><code>tomllib</code></strong> モジュールが標準ライブラリとして追加されました。これにより、設定ファイルなどで利用される TOML 形式を標準機能として扱えるようになりました。</p>



<p class="wp-block-paragraph">近年の Python では、<code>pyproject.toml</code> でプロジェクト設定や依存関係、ツール設定を一元化することが一般的となっているため、<code>tomllib</code> は重要な役割を果たします。</p>



<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"><code>tomllib</code> については「<a href="https://tech.nkhn37.net/python-tomllib-basic/" target="_blank" rel="noreferrer noopener">tomllibでTOMLファイルを読み込む方法</a>」を参考にしてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">Python 3.10</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://docs.python.org/ja/3.10/whatsnew/3.10.html" target="_blank" rel="noreferrer noopener">Python 3.10</a></span> では、新しい構文や型ヒント改善など、Python の書き方に影響する重要な変更が導入されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">構造的パターンマッチ（<code>match</code> / <code>case</code>）</h4>



<p class="wp-block-paragraph">新しい構文として、<strong>構造的パターンマッチ（<code>match</code> / <code>case</code>）</strong>が導入されました。構造的パターンマッチは、3.10 の中心的な新機能であり、最も議論を起こした複雑な機能とも言われています。この機能は受理されるまで何度も議論されました。</p>



<p class="wp-block-paragraph">これは、値のパターンに応じて処理を分岐する仕組みで、他言語の <code>switch</code> に似ていますが、クラス構造などを含めてマッチングできるなど、より柔軟なマッチングを行うことができます。</p>



<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://tech.nkhn37.net/python-structual-pattern-matching-basics/" target="_blank" rel="noreferrer noopener">構造的パターンマッチ（match case）の使い方</a>」を参考にしてください。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold"><code>Union</code> 型（<code>|</code>）</h4>



<p class="wp-block-paragraph">型ヒントで、<code>Union</code> 型を <strong>| 演算子</strong>で <code>X | Y</code> のように記述できるようになりました。<code>Union</code> 型とは、「1 つの変数や引数が、複数の型のうちいずれかを取り得る」ことを示すための型ヒントです。従来の <code>typing.Union[X, Y]</code> といった形式より簡潔に型表現できるようになっています。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>distutils</code> 非推奨</h4>



<p class="wp-block-paragraph">パッケージビルドツールである <code>distutils</code> が非推奨となりました。その後、Python 3.12 で正式に削除されており、現在は <code>setuptools</code> が事実上のデファクトスタンダードの位置づけとなっています。</p>



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



<p class="wp-block-paragraph">この記事では、Python の各バージョン（3.10 以降）の主な新機能や変更点について紹介しました。</p>



<p class="wp-block-paragraph">Python は継続的に進化しており、新しいバージョンでは文法の追加やパフォーマンス改善などが行われています。特に Python 3.10 以降では、構造的パターンマッチや例外グループ、フリースレッドな Python など、言語仕様や実行環境に関わる重要な変更が導入されています。</p>



<p class="wp-block-paragraph">Python 利用の際には、使用バージョンによる違いを意識して使用してみてください。</p>


<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-version-changes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】uvとは？pipとの違いと基本的な使い方を解説</title>
		<link>https://tech.nkhn37.net/python-uv-guide/</link>
					<comments>https://tech.nkhn37.net/python-uv-guide/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[uv]]></category>
		<category><![CDATA[pip]]></category>
		<category><![CDATA[pyproject.toml]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[パッケージ管理]]></category>
		<category><![CDATA[仮想環境]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=13981</guid>

					<description><![CDATA[Python で近年注目されている uv というパッケージおよびプロジェクト管理ツールについて解説します。 uv の概要 uv とは？ uv は、Python 用の高速なパッケージおよびプロジェクト管理ツールです。 従来 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python で近年注目されている <span class="jinr-d--text-color d--marker1 d--bold">uv</span> というパッケージおよびプロジェクト管理ツールについて解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">uv の概要</h2>



<h3 class="wp-block-heading jinr-heading d--bold">uv とは？</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">uv</span> は、Python 用の高速なパッケージおよびプロジェクト管理ツールです。</p>



<p class="wp-block-paragraph">従来の Python 環境の構築では、pip、venv など複数のツールを組み合わせて使用することが一般的でした。uv は、これらの機能を統合して、パッケージ管理、仮想環境管理、依存性管理などを 1 つのツールで扱えるようにしたものであり、pip の代替として非常に注目されているツールです。</p>



<p class="wp-block-paragraph">また、uv は、プログラミング言語の Rust で実装されていることも特徴です。Rust の高速な処理能力を活かすことで、依存関係の解決やパッケージインストールを効率的に行うことができます。</p>



<p class="wp-block-paragraph">この記事では、<span class="jinr-d--text-color d--marker1 d--bold">uv のインストール方法や使い方、pip との違いなど</span>について紹介していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">pip との比較</h3>



<h4 class="wp-block-heading jinr-heading d--bold">主な違い</h4>



<p class="wp-block-paragraph">pip は、Python の標準パッケージインストーラであり、PyPI (Python Package Index) からパッケージをインストールするためのツールです。一方、uv は、パッケージ管理だけでなく、仮想環境管理や依存関係の <code>lock</code> 管理なども統合して提供します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>pip</th><th>uv</th></tr></thead><tbody><tr><td>パッケージ管理</td><td>〇</td><td>〇</td></tr><tr><td>仮想環境作成</td><td>×（venv などの別ツール）</td><td>〇（内蔵）</td></tr><tr><td><code>lock</code> ファイル</td><td>×（標準でなし）</td><td>〇（標準搭載）</td></tr><tr><td>実装言語</td><td>Python</td><td>Rust</td></tr></tbody></table></figure>



<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"><strong>【<code>lock</code> ファイルに関する補足】</strong></p>



<p class="wp-block-paragraph">pip 自体には、<code>lock</code> ファイルの仕組みは標準では提供されていません。再現性を確保するためには「<code>pip freeze</code>」などを利用して <code>requirements.txt</code> を生成することが一般的です。</p>



<p class="wp-block-paragraph">一方 uv では、<code>lock</code> ファイル（<code>uv.lock</code>）が標準機能として提供されており、依存関係固定と再現性確保が容易になっています。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">速度の違い</h4>



<p class="wp-block-paragraph">uv は、Rust で開発されており、並列ダウンロードや効率的な I/O 処理により非常に高速に処理ができます。以下は、uv の公式サイトで紹介されている指標です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="686" height="306" src="https://tech.nkhn37.net/wp-content/uploads/2026/02/image-1.png" alt="uv 公式サイト 速度比較" class="wp-image-13987" style="aspect-ratio:2.2419122192458274;width:503px;height:auto" srcset="https://tech.nkhn37.net/wp-content/uploads/2026/02/image-1.png 686w, https://tech.nkhn37.net/wp-content/uploads/2026/02/image-1-300x134.png 300w" sizes="(max-width: 686px) 100vw, 686px" /><figcaption class="wp-element-caption"><a href="https://docs.astral.sh/uv/" target="_blank" rel="noreferrer noopener">uv 公式サイト</a> より引用<br>（記事執筆時点のため記載は変更されている可能性があります）</figcaption></figure>
</div>


<p class="wp-block-paragraph">このベンチマークでは、Python の非同期ライブラリ Trio の依存パッケージをインストールする際の速度が比較されています。Trio は、<code>async</code> / <code>await</code> を利用した非同期処理を扱う Python ライブラリで、このライブラリの依存関係をインストールする処理を各ツールで比較しています。</p>



<p class="wp-block-paragraph">また、この測定は、warm cache (依存関係が既にキャッシュされている状態) で行われています。結果を見ると、poetry や pdm などの他ツールに比べて uv は非常に高速に処理できることが分かります。</p>



<h2 class="wp-block-heading jinr-heading d--bold">uv のインストール方法</h2>



<h3 class="wp-block-heading jinr-heading d--bold">uv のインストール方法</h3>



<p class="wp-block-paragraph">uv のインストール方法を紹介します。手順は、公式の<a href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noreferrer noopener">こちら</a>を参照しています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Windows でのインストール</h4>



<p class="wp-block-paragraph">Windows では、PowerShell を利用して以下のコマンドを実行します。</p>



<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="">powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"</pre>



<p class="wp-block-paragraph">実際のインストールは「<code>"irm https://astral.sh/uv/install.ps1 | iex"</code>」の部分で実行されています。<code>irm</code> は、指定URLからデータを取得する PowerShell のコマンドで、インストールスクリプトをダウンロードし、<code>iex</code> に渡して実行しています。</p>



<p class="wp-block-paragraph">「<code>powershell -ExecutionPolicy ByPass</code>」は、この起動した PowerShell プロセスだけ実行ポリシーを無視してスクリプトを実行するための指定です。</p>



<p class="wp-block-paragraph">インストールが完了すると「<code>uv.exe</code>」などの実行ファイルがインストールされます。<code>PATH</code> も自動的に設定されるため、PowerShell を再起動すると <code>uv</code> コマンドが使用できるようになります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Linux/ macOS</h4>



<p class="wp-block-paragraph">Linux や macOS では、以下のコマンドを実行します。</p>



<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="">curl -LsSf https://astral.sh/uv/install.sh | sh</pre>



<h2 class="wp-block-heading jinr-heading d--bold">uv によるプロジェクトの作成と管理</h2>



<h3 class="wp-block-heading jinr-heading d--bold">uv によるプロジェクトの作成</h3>



<p class="wp-block-paragraph">uv では、「<span class="jinr-d--text-color d--marker1 d--bold"><code>uv init</code></span>」コマンドを使用して新しいプロジェクトを作成できます。以下は、<code>my-project</code> というプロジェクトを作成する例です。</p>



<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="">uv init my-project</pre>



<p class="wp-block-paragraph">このコマンドを実行すると、<code>my-project</code> というフォルダに以下のようなファイルが自動で生成されます。</p>



<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="">my-project
├ .gitignore
├ .python-version
├ main.py
├ pyproject.toml
└ README.md</pre>



<p class="wp-block-paragraph">簡単に各ファイルの説明をしておきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>pyproject.toml</code></h4>



<p class="wp-block-paragraph">Python プロジェクトの設定ファイルです。プロジェクト情報を管理するために使用され、近年の Python プロジェクトでは、<code>pyproject.toml</code> が標準的な設定ファイルとして利用されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>main.py</code></h4>



<p class="wp-block-paragraph">エントリーポイントとして利用できるサンプルの Python ファイルです。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>README.md</code></h4>



<p class="wp-block-paragraph">プロジェクトの概要や使い方などを記述するためのファイルです。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>.gitignore</code></h4>



<p class="wp-block-paragraph">Git の管理から除外するファイルを指定する設定ファイルです。Python プロジェクトでは、仮想環境、キャッシュファイル、一時生成ファイルなどは Git 管理対象外として除外することが一般的です。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>.python-version</code></h4>



<p class="wp-block-paragraph">使用する Python バージョンを指定するファイルです。プロジェクト単位で使用する Python バージョンを明示できます。仮想環境作成時に uv は、このファイルを参照しており、開発環境ごとの Python バージョン差異を防ぐことができるようになります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">パッケージの管理方法</h3>



<p class="wp-block-paragraph">パッケージ管理は、<code>uv</code> コマンドを使用して実行します。作成したプロジェクトの配下で以下で紹介するようなコマンドを使用します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">パッケージの追加</h4>



<p class="wp-block-paragraph">パッケージの追加は「<span class="jinr-d--text-color d--marker1 d--bold"><code>uv add</code></span>」コマンドで行います。以下は、NumPy の追加例です。</p>



<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="">uv add numpy</pre>



<p class="wp-block-paragraph">複数のパッケージをまとめてインストールする場合は、スペースでパッケージを列挙すればまとめてインストールできます。</p>



<p class="wp-block-paragraph">仮想環境や <code>lock</code> ファイルがない場合は生成され、<code>lock</code> ファイルには、依存パッケージの具体的なバージョン情報が記録され、プロジェクトの依存関係を再現できます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">パッケージの削除</h4>



<p class="wp-block-paragraph">パッケージを削除する場合は「<span class="jinr-d--text-color d--marker1 d--bold"><code>uv remove</code></span>」コマンドを次のようにします。</p>



<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="">uv remove numpy</pre>



<p class="wp-block-paragraph"><code>uv add</code> や <code>uv remove</code> で操作されたパッケージの依存関係は自動的に解決され、<code>uv.lock</code> が更新されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">依存関係の表示（<code>uv tree</code>）</h4>



<p class="wp-block-paragraph">インストールしたパッケージの依存関係ツリーを表示したい場合には「<span class="jinr-d--text-color d--marker1 d--bold"><code>uv tree</code></span>」コマンドを使用します。</p>



<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="">uv tree</pre>



<p class="wp-block-paragraph">例えば、NumPy、pandas、scikit-learn をインストールした状態だと以下のような依存性のツリーを確認できます。</p>



<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="">my-project v0.1.0
├── numpy v2.4.2
├── pandas v3.0.1
│   ├── numpy v2.4.2
│   ├── python-dateutil v2.9.0.post0
│   │   └── six v1.17.0
│   └── tzdata v2025.3
└── scikit-learn v1.8.0
    ├── joblib v1.5.3
    ├── numpy v2.4.2
    ├── scipy v1.17.1
    │   └── numpy v2.4.2
    └── threadpoolctl v3.6.0</pre>



<h3 class="wp-block-heading jinr-heading d--bold"><code>uv run</code> によるプログラム実行</h3>



<p class="wp-block-paragraph">uv では、「<span class="jinr-d--text-color d--marker1 d--bold"><code>uv run</code></span>」コマンドを使用して以下のようにプログラムを実行できます。</p>



<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="">uv run main.py</pre>



<p class="wp-block-paragraph">通常 Python 開発環境を利用する場合には、以下のような手順を踏む必要があります。</p>



<ol class="wp-block-list jinr-list">
<li>仮想環境（<code>venv</code>）を作成</li>



<li>仮想環境を <code>activate</code></li>



<li>Python プログラムを実行</li>
</ol>



<p class="wp-block-paragraph">一方で、<code>uv run</code> を用いると、仮想環境が自動的に管理されるため、<code>activate</code> を意識せずにプログラムの実行ができます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">仮想環境（<code>.venv</code>）や <code>uv.lock</code> の生成タイミング</h3>



<p class="wp-block-paragraph"><code>uv init</code> でプロジェクトを生成したタイミングでは、仮想環境（<code>.venv</code>）や uv.lock ファイルは、生成されません。</p>



<p class="wp-block-paragraph">これらは上記で紹介したような「<code>uv run</code>」「<code>uv add</code>」などのプロジェクトコマンドが最初に実行されたタイミングで生成されます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">仮想環境の自動管理</h3>



<p class="wp-block-paragraph">uv では、仮想環境が自動的に管理されるため、明示的な venv の作成や activate を意識する必要がありません。プロジェクト単位で Python 環境が管理されるため、複数のプロジェクトを扱う場合でも環境の衝突を防ぐことができます。また、プロジェクトごとに Python のバージョン指定をすることも可能です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">uv 使用に関する注意点</h3>



<p class="wp-block-paragraph">uv は、新しい Python プロジェクトでは非常に有力な選択肢となります。一方で、pip を中心としたプロジェクト管理と比較すると歴史はまだ浅いです。</p>



<p class="wp-block-paragraph">既存の大規模プロジェクトへ導入する場合は、CI / CD 環境との整合性やチーム運用方針を確認しながら、段階的に導入を検討すると良いでしょう。新規のプロジェクトでは、ぜひ uv の採用を検討してみてください。</p>



<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"><strong>【参考】Rust の Cargo との類似性</strong></p>



<p class="wp-block-paragraph">Rust での開発を経験したことがある場合、uv の設計は Cargo と似ていると感じるかもしれません。</p>



<p class="wp-block-paragraph">Cargo は、Rust 公式パッケージマネージャ兼ビルドツールであり、依存関係管理やビルドなどを 1 つのツールで扱うことができます。</p>



<p class="wp-block-paragraph">uv も同様に、プロジェクト管理・依存関係管理・実行などを統合して提供しており、設計思想に共通点があります。</p>
</div>
		</div></section>



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



<p class="wp-block-paragraph">Python で近年注目されている <span class="jinr-d--text-color d--marker1 d--bold">uv</span> というパッケージおよびプロジェクト管理ツールについて解説しました。</p>



<p class="wp-block-paragraph">uv は、Rust 製の高速な Python パッケージ・プロジェクト管理ツールです。pip での環境構築では複数ツールを組み合わせて行っていた「パッケージ管理」「仮想環境管理」「依存関係管理」を統合的に提供します。</p>



<p class="wp-block-paragraph">uv は、pip に比べると歴史が浅いため、大規模プロジェクトでの採用には、段階的導入を検討するなど注意が必要ですが、新規プロジェクトでは、シンプルで再現性の高い開発環境を構築できるツールとして有力な選択肢となるでしょう。</p>


<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-uv-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】VSCode × Ruff で自動フォーマット＆Lint 設定方法</title>
		<link>https://tech.nkhn37.net/python-vscode-ruff/</link>
					<comments>https://tech.nkhn37.net/python-vscode-ruff/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 13 Feb 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[VS Code]]></category>
		<category><![CDATA[black]]></category>
		<category><![CDATA[flake8]]></category>
		<category><![CDATA[isort]]></category>
		<category><![CDATA[ruff]]></category>
		<category><![CDATA[Rust]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=13948</guid>

					<description><![CDATA[Python の高速なリンター兼フォーマッターである Ruff の概要と VSCode での設定方法を解説します。 Ruff とは Ruff（ラフ）は、Python 向けの高速なリンター兼フォーマッターです。プログラム言 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の高速なリンター兼フォーマッターである <span class="jinr-d--text-color d--marker1 d--bold">Ruff の概要と VSCode での設定方法</span>を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Ruff とは</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">Ruff（ラフ）</span>は、Python 向けの高速なリンター兼フォーマッターです。プログラム言語としては、Rust で実装されており、従来の flake8、black、isort が担っていた役割を 1 つのツールで担える点が特徴です。</p>



<p class="wp-block-paragraph">Ruff は、CLI ツールとして利用できるため Visual Studio Code (VS Code) に限らず、その他の統合開発環境（IDE）でも使用できます。</p>



<p class="wp-block-paragraph">この記事では、Python の開発環境として非常によく利用されている VS Code での利用方法に焦点をあてて解説します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff でできること</h3>



<p class="wp-block-paragraph">Ruff では、主に以下の機能を提供します。</p>



<ul class="wp-block-list jinr-list">
<li>フォーマット（コード整形）</li>



<li>静的解析（Lint）</li>



<li><code>import</code> の整理</li>
</ul>



<p class="wp-block-paragraph">コマンドとしては以下のように使用できます。</p>



<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="">ruff format .</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="">ruff check . --fix</pre>



<p class="wp-block-paragraph">Ruff は、コード整形でよく使われる black 互換のフォーマット機能、flake8 の静的解析（Lint）、isort 相当の import 整理機能を 1 つのツールで扱うことができます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff の特徴</h3>



<p class="wp-block-paragraph">Ruff の主な特徴を整理しておきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold"> 高速性</h4>



<p class="wp-block-paragraph">Ruff は、プログラム言語の Rust で実装がされており、大規模プロジェクトでも非常に高速に動作します。</p>



<p class="wp-block-paragraph">Rust は、C/C++に匹敵する高性能を持ちながら、メモリ安全性が高く、Pythonなどのモダンな言語に見られる表現のしやすさも備えている、非常に優れた言語です。従来の Python 製リンターと比較しても非常に高速です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">多機能な静的解析（Lint）</h4>



<p class="wp-block-paragraph">flake8 のルールに加えて、多数のルールを内包しており、<code>pyproject.toml</code> によりルールを細かく制御することができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">設定の一元管理</h4>



<p class="wp-block-paragraph">設定は、<code>pyproject.toml</code> にまとめて記述することができます。これにより、フォーマットと Lint の設定を同一ファイルで管理できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff の歴史と位置づけ</h3>



<p class="wp-block-paragraph">Ruff は、2022 年頃に登場して急速に注目を集めてきました。高速性と利便性から、多くのプロジェクトでの採用が進んでいます。</p>



<p class="wp-block-paragraph">近年では、Rust 製のツールが Python エコシステムを補完する動きが多くみられます（uv や Polars など）。その流れの中で、Ruffも実用的で高速な開発基盤ツールとして位置づけられています。新規プロジェクトでは black や isort の代替として、Ruff を採用するケースも増えています。</p>



<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">JetBrains 社の「<a href="https://blog.jetbrains.com/ja/pycharm/2025/09/the-state-of-python/" target="_blank" rel="noreferrer noopener">2025 年 Python の現状</a>」というブログ記事でも、Rust は過去数年間にわたって Python のパフォーマンスを支えてきている旨の記載があります。</p>
</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">私は、Rust も非常に好きな言語で Python と同様に学習サイト「<a href="https://rust-tech.nkhn37.net/" target="_blank" rel="noreferrer noopener">Rust Tech ~Rust学習サイト~</a>」も運営しています。</p>



<p class="wp-block-paragraph">なお、Rust の特徴は「<a href="https://rust-tech.nkhn37.net/rust-overview-guide/" target="_blank" rel="noreferrer noopener">Rustとは？特徴や他言語との違いまで徹底解説！</a>」にまとめているので参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">VSCode で Ruff を設定して使用する方法</h2>



<p class="wp-block-paragraph">ここからは、VS Code で Ruff を実際に利用する方法を解説します。なお、Ruff は CLI ツールであるため、以下の両方が必要です。</p>



<ul class="wp-block-list jinr-list">
<li>プロジェクトに Ruff をインストールする</li>



<li>VS Code の Ruff 拡張をインストールする</li>
</ul>



<p class="wp-block-paragraph">それぞれをインストールした上での基本的な設定方法などを紹介していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff のインストール</h3>



<p class="wp-block-paragraph">Ruff をインストールする場合は、以下のようにインストールします。</p>



<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="">pip install ruff</pre>



<p class="wp-block-paragraph">また、uv を使用している場合は、以下でインストールします。</p>



<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="">uv add ruff</pre>



<p class="wp-block-paragraph">ここで、インストールされるのは Ruff 本体の CLI ツールです。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff の VSCode 拡張のインストール</h3>



<p class="wp-block-paragraph">次に、VS Code 拡張機能から Ruff をインストールします。VS Code の拡張機能で「Ruff」と検索すると、Astral Software の Ruff 拡張が検索できますのでインストールします。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="874" height="174" src="https://tech.nkhn37.net/wp-content/uploads/2026/02/image.png" alt="VS Code の Ruff 拡張" class="wp-image-13963" srcset="https://tech.nkhn37.net/wp-content/uploads/2026/02/image.png 874w, https://tech.nkhn37.net/wp-content/uploads/2026/02/image-300x60.png 300w, https://tech.nkhn37.net/wp-content/uploads/2026/02/image-768x153.png 768w" sizes="(max-width: 874px) 100vw, 874px" /></figure>
</div>


<p class="wp-block-paragraph">Ruff 本体は、CLI ツールであり、この VS Code 拡張は、エディタ連携のための拡張機能という位置づけとなっています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff に関する VS Code の基本的な設定（<code>setting.json</code>）</h3>



<p class="wp-block-paragraph">Ruff を使用するにあたっての VS Code 側の基本的な設定を紹介します。</p>



<p class="wp-block-paragraph">VS Code の「<code>Ctrl + Shift + P</code>」でコマンドパレットを開き、「Preferences: Open Settings (JSON)」から <code>setting.json</code> を開きます。</p>



<p class="wp-block-paragraph">VS Code の設定は大きく次の 3 種類があります。</p>



<ul class="wp-block-list jinr-list">
<li>既定値（Default）：VS Code 本体や拡張機能が持つ初期設定</li>



<li>ユーザー設定（User）：ユーザー個人に適用される設定</li>



<li>ワークスペース設定（Workspace）：プロジェクト単位に適用される設定</li>
</ul>



<p class="wp-block-paragraph">プロジェクト単位で Ruff 有効にしたい場合は、ワークスペース設定（<code>.vscode/settings.json</code>）に記述するのがおすすめです。チーム開発では、この方法により設定を共有できます。</p>



<p class="wp-block-paragraph">一方、自身が扱うすべてのプロジェクトで Ruff を有効にしたい場合は「ユーザー設定（User）」に記述しても問題ありません。</p>



<p class="wp-block-paragraph">settings.json に以下の記載を追加してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "[python]": {
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit",
      "source.organizeImports.ruff": "explicit"
    }
  }
}</pre>



<p class="wp-block-paragraph">各項目の補足説明は以下の通りです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>説明</th></tr></thead><tbody><tr><td><code>[python]</code></td><td>Python 言語モードのファイル（通常は .py）にのみ適用される設定です。他言語への影響を防ぐために、Ruff 関連の設定はこのセクションにまとめておくのがおすすめです。</td></tr><tr><td><code>editor.defaultFormatter</code></td><td>&#8220;charliermarsh.ruff&#8221; を指定することで、Python ファイルのフォーマッターとして Ruff を指定します。</td></tr><tr><td><code>editor.formatOnSave</code></td><td><code>true</code> に設定することでファイル保存時に自動でフォーマットを実行します。</td></tr><tr><td><code>editor.codeActionsOnSave</code></td><td>保存時に追加で実行するコードアクションを指定します。</td></tr><tr><td><code>source.fixAll.ruff</code></td><td>Ruff による Lint エラーの自動修正を保存時に実行します。</td></tr><tr><td><code>source.organizeImports.ruff</code></td><td>Ruff による <code>import</code> 文の整理（<code>isort</code> 相当）を保存時に実行します。</td></tr></tbody></table></figure>



<h3 class="wp-block-heading jinr-heading d--bold">Ruff の詳細設定（<code>pyproject.toml</code>）</h3>



<p class="wp-block-paragraph">Ruff の詳細設定は <code>pyproject.toml</code> に記述します。</p>



<p class="wp-block-paragraph">Ruff は、デフォルトでも実用的な設定が有効になっているため、基本的には、<code>pyproject.toml</code> に追加の設定を記述しなくても利用できます。</p>



<p class="wp-block-paragraph">ただし、プロジェクト方針やコーディング規約に応じて、設定を明示的に変更することも可能です。ここでは、代表的な設定の一部を紹介します。</p>



<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">Ruff の設定は以下で紹介する項目以外にも多くの設定があります。指定可能な項目については、公式ドキュメントの <a href="https://docs.astral.sh/ruff/settings/" target="_blank" rel="noreferrer noopener">Settings</a>を参照してください。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">基本設定 <code>[tool.ruff]</code></h4>



<p class="wp-block-paragraph">Ruff の基本的な挙動は <code>[tool.ruff]</code> セクションで設定します。</p>



<p class="wp-block-paragraph">例えば、代表的な設定として、1 行当たりの最大文字数は以下のように設定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[tool.ruff]
line-length = 88</pre>



<p class="wp-block-paragraph">Ruff のデフォルトは、black 互換の設定の 88 文字であるため、基本的に上記のような記載は必要ありません。</p>



<p class="wp-block-paragraph">一方で、PEP8 準拠の 79 文字にしたい場合には、次のように指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[tool.ruff]
line-length = 79</pre>



<p class="wp-block-paragraph">プロジェクトのコーディング規約にあわせて調整してください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Lint 設定 <code>[tool.ruff.lint]</code></h4>



<h5 class="wp-block-heading jinr-heading d--bold">ルール群の指定方法（<code>select</code>）</h5>



<p class="wp-block-paragraph">Ruff には、複数のリントルールがあります。こちらも基本的にはデフォルト設定で問題ありませんが、以下のように <code>[tool.ruff.lint]</code> セクションで制御できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[tool.ruff.lint]
select = ["E", "F", "I"]</pre>



<p class="wp-block-paragraph"><code>select</code> では、ルール群を表す文字列を指定します。なお、Ruff の記事執筆時点でのデフォルト設定は、<code>["E4", "E7", "E9", "F"]</code> です。これは、実行時エラーにつながる可能性が高い問題や、明確なコーディングエラーを中心に検出するルール群が有効になっていることを意味します。</p>



<p class="wp-block-paragraph">リントのルール一覧は、公式ページの <a href="https://docs.astral.sh/ruff/rules/" target="_blank" rel="noreferrer noopener">Rules</a> ページにまとめられています。このページの「Code」列に書かれている値が各ルールを示すコードです。</p>



<p class="wp-block-paragraph">例えば、<code>"E"</code> は、pycodestyle 由来のルール群を示します。また、<code>"E4"</code> は <code>"E4"</code>から始まるルールコードをまとめて指定する指定方法で、Rules ページを確認すると、<code>"E4"</code> には以下のルールが含まれることになります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Code</th><th>Name</th><th>Message</th></tr></thead><tbody><tr><td>E401</td><td>multiple-imports-on-one-line</td><td>Multiple imports on one line</td></tr><tr><td>E402</td><td>module-import-not-at-top-of-file</td><td>Module level import not at top of cell</td></tr></tbody></table><figcaption class="wp-element-caption">※ 記事執筆時点での<a href="https://docs.astral.sh/ruff/rules/" target="_blank" rel="noreferrer noopener">公式ページ</a>から抜粋</figcaption></figure>



<p class="wp-block-paragraph">なお、<code>"E"</code> を指定すれば、<code>"E"</code> から始まる pycodestyle 由来のリントルール群がすべて有効になります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">ルールの除外（<code>ignore</code>）</h5>



<p class="wp-block-paragraph">まとめて指定した際に、特定ルールのみを除外したい場合は、<code>ignore</code> を使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[tool.ruff.lint]
select = ["E", "F", "I"]
ignore = ["E501"]</pre>



<p class="wp-block-paragraph">上記では、<code>"E"</code> から始まるルール群をすべて有効にしつつ、<code>"E501"</code>（行長の違反） のみを除外しています。</p>



<p class="wp-block-paragraph">Ruff は、デフォルト設定でも十分実用的です。まずは、デフォルトのまま導入し、必要に応じて、<code>pyproject.toml</code> を用いて柔軟に調整していくのがおすすめです。プロジェクトの方針に応じて検討してください。</p>



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



<p class="wp-block-paragraph">Python の高速なリンター兼フォーマッターである <span class="jinr-d--text-color d--marker1 d--bold">Ruff の概要と VSCode での設定方法</span>を解説しました。</p>



<p class="wp-block-paragraph">Ruff を導入することで、コード整形や静的解析（Lint）、import 整理といった機能を 1 つのツールで扱うことができるようになります。Ruff は、Rust で実装がされており非常に高速であることが特徴です。</p>



<p class="wp-block-paragraph">VS Code と組み合わせることで、保存時に自動フォーマットや Lint 修正が実行され、より快適な Python 開発環境を構築できます。</p>



<p class="wp-block-paragraph">Ruff 自体の設定方法についても一部紹介しましたが、Ruff はデフォルト設定でも十分実用的であり、まずは最小構成で導入し、必要に応じて <code>pyproject.toml</code> で調整していくのがおすすめです。</p>



<p class="wp-block-paragraph">ぜひプロジェクトに導入してみてください。</p>


<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-vscode-ruff/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】zstd によりデータを圧縮／解凍する基本</title>
		<link>https://tech.nkhn37.net/python-zstd-basic/</link>
					<comments>https://tech.nkhn37.net/python-zstd-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 31 Jan 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[zstd]]></category>
		<category><![CDATA[compress]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[compression.zstd]]></category>
		<category><![CDATA[decompress]]></category>
		<category><![CDATA[level]]></category>
		<category><![CDATA[Python 3.14]]></category>
		<category><![CDATA[Zstandard]]></category>
		<category><![CDATA[zstd.open]]></category>
		<category><![CDATA[ストリーミング処理]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=13791</guid>

					<description><![CDATA[Python で zstd により Zstandard アルゴリズムを使ったデータ圧縮／解凍をする方法の基本について解説します。 Zstandard (zstd) の概要 Zstandard は、Meta（旧 Faceb [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python で <span class="jinr-d--text-color d--marker1 d--bold"><code>zstd</code> により Zstandard アルゴリズムを使ったデータ圧縮／解凍をする方法</span>の基本について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Zstandard (<code>zstd</code>) の概要</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">Zstandard</span> は、Meta（旧 Facebook）が開発した圧縮アルゴリズムです。Zstandard は、「高速」で「高圧縮率」のバランスの取れた圧縮形式として普及が進んでいます。</p>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>zstd</code></span> は、Zstandard の略称でライブラリ名としてよく使われており、Python では、Python 3.14 から標準ライブラリとして <code>zstd</code> モジュールが提供されています。</p>



<p class="wp-block-paragraph">この記事では、<code>zstd</code> により Zstandard アルゴリズムを使ったデータを圧縮する方法の基本について紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">標準としての <code>zstd</code> 使用するには、Python 3.14 以降を使用する必要があるので注意してください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">Zstandard の標準ライブラリ化 <code>zstd</code></h3>



<p class="wp-block-paragraph">これまでは、Python における圧縮ライブラリは、<code>gzip</code>、<code>zlib</code>、<code>bz2</code>、<code>lzma</code> といったライブラリが標準ライブラリとして使用できました。これらは標準であることの安心感や長年の互換性・安定性という面で優れる一方で、性能面では Zstandard の方が高速、高圧縮率という状況でした。</p>



<p class="wp-block-paragraph">Python の 3.13 以前でも Zstandard が使えなかったというわけではなく、外部ライブラリとして「<code>pip install zstandard</code>」とすることで使用できました。外部ライブラリとして成熟はしていたものの、Python の標準ライブラリではなかったため、依存関係や運用面の観点から標準的には採用しずらい状況がありました。</p>



<p class="wp-block-paragraph"><a href="https://peps.python.org/pep-0784/" target="_blank" rel="noreferrer noopener">PEP 784</a> に基づき、Python 3.14 に <code>zstd</code> ライブラリとして取り込まれたことで、これらの懸念は大きく緩和され、標準的に使用しやすくなりました。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>zstd</code> の基本的な使い方</h2>



<h3 class="wp-block-heading jinr-heading d--bold"><code>zstd</code> による基本的なデータ圧縮／解凍方法</h3>



<p class="wp-block-paragraph"><code>zstd</code> では、<code>bytes</code> データの圧縮を <span class="jinr-d--text-color d--marker1 d--bold"><code>compress()</code></span> 関数、解凍を <span class="jinr-d--text-color d--marker1 d--bold"><code>decompress()</code></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="">from compression import zstd

# 圧縮／解凍対象のデータ
data = "Zstandard 圧縮テストデータ".encode("utf-8")

# zstd を使ってデータを圧縮
compressed = zstd.compress(data)

# zstd を使ってデータを解凍
restored = zstd.decompress(compressed)
print(f"解凍後のデータ: {restored.decode('utf-8')}")</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="">【実行結果】
解凍後のデータ: Zstandard 圧縮テストデータ</pre>



<p class="wp-block-paragraph"><code>zstd</code> は、<code>compression</code> モジュール配下にあるので「<code>from compression import zstd</code>」のようにインポートして使います。</p>



<p class="wp-block-paragraph">例では、文字列を圧縮／解凍してます。<code>compress()</code> に対象データを渡すと圧縮データが生成され、圧縮したデータを <code>decompress()</code> に渡して解凍することで元のデータを復元できます。</p>



<p class="wp-block-paragraph">なお、<code>compress()</code> / <code>decompress()</code> は、<code>bytes</code> 型を扱う API であるため、例のように文字列（<code>str</code>）を圧縮する場合には、事前に <code>encode()</code> で <code>bytes</code> に変換し、解凍後には <code>decode()</code> で文字列に戻します。</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 3.14 からは、圧縮形モジュールは以下のように <code>compression</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="">from compression import gzip
from compression import zlib
from compression import bz2
from compression import lzma</pre>



<p class="wp-block-paragraph">ただし、従来通りの「<code>import gzip</code>」のような呼び出し方が非推奨となったわけではありませんので、これまで通り使用可能です。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">圧縮レベルの設定 <code>level</code></h3>



<p class="wp-block-paragraph"><code>zstd</code> では、圧縮のレベルを 1 ~ 22 の値を指定することができます。値が大きいほど高圧縮になりますが、処理時間が多くかかります。圧縮レベルを指定するには <span class="jinr-d--text-color d--marker1 d--bold"><code>level</code></span> 引数を指定します。何も指定しないときのデフォルトは <code>level=3</code> となります。</p>



<p class="wp-block-paragraph">以下では、4つのパターンで圧縮率を比較してみます。</p>



<ul class="wp-block-list jinr-list">
<li><code>level=1</code> (高速・低圧縮)</li>



<li><code>level=3</code> (デフォルト)</li>



<li><code>level=10</code> (中程度の圧縮)</li>



<li><code>level=22</code> (最大設定で高圧縮)</li>
</ul>



<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 compression import zstd
from datetime import datetime, timedelta

# ログ風の大きなテストデータを生成
lines = []
start = datetime.now()
num = 100_000

for i in range(num):
    ts = start + timedelta(seconds=i % 60)
    lines.append(
        f"{ts.strftime('%Y-%m-%dT%H:%M:%S')} INFO user_id={i%10000} action=click page=/items/{i%500}\n"
    )
data = "".join(lines).encode("utf-8")


def report_compression_results(level, compressed, original_size):
    """圧縮結果を表示する関数"""

    compressed_size = len(compressed)
    compression_percent = (compressed_size / original_size) * 100

    print(
        f"Level {level:>2}:"
        f" 圧縮後サイズ: {compressed_size:>10,} バイト,"
        f" 圧縮後サイズ比: {compression_percent:>6.2f} %"
    )


original_size = len(data)
print(f"元のサイズ: {original_size:,} バイト")

# level=1 (高速圧縮)
compressed_level1 = zstd.compress(data, level=1)
report_compression_results(1, compressed_level1, original_size)

# zstd を使ってデータを圧縮 (level指定による変化を確認)
# デフォルトは level=3
compressed = zstd.compress(data)
report_compression_results(3, compressed, original_size)

# level=10 (中程度の圧縮)
compressed_level10 = zstd.compress(data, level=10)
report_compression_results(10, compressed_level10, original_size)

# level=22 (最大の設定、最高圧縮、非常に遅い)
compressed_level22 = zstd.compress(data, level=22)
report_compression_results(22, compressed_level22, original_size)</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="">【実行結果】
元のサイズ: 6,666,900 バイト
Level  1: 圧縮後サイズ:    192,821 バイト, 圧縮後サイズ比:   2.89 %
Level  3: 圧縮後サイズ:    139,030 バイト, 圧縮後サイズ比:   2.09 %
Level 10: 圧縮後サイズ:     37,436 バイト, 圧縮後サイズ比:   0.56 %
Level 22: 圧縮後サイズ:     25,827 バイト, 圧縮後サイズ比:   0.39 %</pre>



<p class="wp-block-paragraph">結果を見るとレベルを上げるほど、高い圧縮率で圧縮できていることが分かります。</p>



<p class="wp-block-paragraph">圧縮レベルは高いほど圧縮率は向上しますが、その分CPU負荷が増加します。多くのケースではデフォルト（<code>level=3</code>）が速度と圧縮率のバランスがよく、まずは <code>level</code> 指定せずに利用するのがおすすめです。</p>



<p class="wp-block-paragraph">一方で、ストレージ削減や転送量削減を重視する場合は、<code>level=6~10</code> 程度を検討するのが良いでしょう。それ以上の <code>level</code> は、CPU 負荷増加に対して圧縮率の改善幅は小さい結果となる可能性が高いです。</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">今回は、ログ風データで規則性があり、圧縮しやすいデータのため、圧縮率が非常に高くなっていますが、画像、動画などの規則性が少ないデータでは、圧縮前後であまり差が出ないことがあります。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold"><code>zstd</code> によるストリーミング圧縮／解凍方法</h2>



<p class="wp-block-paragraph"><code>compress()</code> / <code>decompress()</code> は、<code>bytes</code> を一括で圧縮／解凍するために非常に便利ですが、巨大なファイルを対象にする場合は、すべてのデータをメモリに読み込む必要があり、メモリ消費量が大きくなってしまいます。</p>



<p class="wp-block-paragraph">そこで、大容量のファイルでは、一定サイズのチャンク（塊）毎にデータ読み込みながら、圧縮／解凍する「<span class="jinr-d--text-color d--marker1 d--bold">ストリーミング処理</span>」を利用します。</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 datetime import datetime, timedelta


def create_sample_log_file(filepath: str, size_mb: int = 10) -> None:
    """指定サイズ(MB) 以下に収まるログ風のサンプルファイルを作成する関数

    Args:
        filepath (str): 作成するファイルのパス
        size_mb (int, optional): 目標サイズ(MB). デフォルトは10MB.
    """
    target_size = size_mb * 1024 * 1024  # MB をバイトに変換
    start = datetime.now()

    written = 0
    i = 0

    with open(filepath, "wb") as f:
        while written &lt; target_size:
            ts = start + timedelta(seconds=i % 60)
            line = (
                f"{ts:%Y-%m-%dT%H:%M:%S} INFO user_id={i%10000} "
                f"action=click page=/items/{i%500}\n"
            ).encode("utf-8")

            # 書き込み後にサイズ超過しそうなら終了
            if written + len(line) > target_size:
                break

            f.write(line)
            written += len(line)
            i += 1

    print(f"Created: {filepath}")
    print(f"Target : {size_mb} MB ({target_size:,} bytes)")
    print(f"Actual : {written / 1024 / 1024:.2f} MB ({written:,} bytes)")
    print(f"Lines  : {i:,}")


if __name__ == "__main__":
    path = "sample.log"
    create_sample_log_file(path, size_mb=100)</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="">【実行結果例】
Created: sample.log
Target : 100 MB (104,857,600 bytes)
Actual : 100.00 MB (104,857,567 bytes)
Lines  : 1,572,821</pre>



<p class="wp-block-paragraph">上記スクリプトは、<code>create_sample_log_file</code> 関数にファイルパスとサイズ（MB）を指定するとログ風のファイルを作成します。以降例では、<code>sample.log</code>という 100 MB のファイルを例に紹介します。</p>



<p class="wp-block-paragraph">このように事前に大きなファイルを用意しておくことで、ストリーミング圧縮によるメモリ使用量の違いを確認しやすくなります。もちろん、お手元に大きなファイルがあればそちらを使って試していただいて構いません。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ストリーミング圧縮</h3>



<p class="wp-block-paragraph"><code>zstd</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 compression import zstd


def compress_file(
    src_path: str, dst_path: str, level: int | None = None
) -> None:
    """ファイルをストリーム圧縮する関数

    Args:
        src_path (str): 圧縮対象のファイルパス
        dst_path (str): 圧縮先ファイルパス
        level (int | None, optional): 圧縮レベル. デフォルトは None (zstd のデフォルトレベル 3 ).
    """
    # 1 MB のチャンクで処理
    chunk_size = 1024 * 1024

    # 対象ファイルを開いてストリーム圧縮
    with open(src_path, "rb") as f_in:
        # zstd で圧縮先ファイルを開く
        with zstd.open(dst_path, "wb", level=level) as f_out:
            # chunk_size ごとに読み込みながら圧縮して書き込み
            # ファイル末尾の b"" で停止するイテレータを使用
            for chunk in iter(lambda: f_in.read(chunk_size), b""):
                f_out.write(chunk)


if __name__ == "__main__":
    source_path = "sample.log"
    dest_path = "sample.log.zst"
    compress_file(source_path, dest_path)</pre>



<p class="wp-block-paragraph">例では、圧縮対象のパス（<code>src_path</code>）と圧縮先のパス（<code>dst_path</code>）、および圧縮レベル（<code>level</code>）を引数に受け取り、ストリーム圧縮する関数 <code>compress_file()</code> を作成しています。なお、<code>level</code> は、指定がない（<code>None</code>）の場合は、<code>zstd</code> のデフォルトの <code>level=3</code> になります。</p>



<p class="wp-block-paragraph">今回は、1 MB のチャンク（塊）でソースファイルのデータを読み込んでいきます。</p>



<p class="wp-block-paragraph"><code>zstd.open</code> は、圧縮ファイル（<code>.zst</code>）をファイルオブジェクトとして扱えるようにするものです。例では、読み込みファイルを <code>open</code> のバイナリ読み込み（<code>"rb"</code>）で、圧縮先ファイルを <code>zstd.open</code> のバイナリ書き込み（<code>"wb"</code>）で開いています。なお、圧縮レベル（<code>level</code>）は、<code>zstd.open</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=""># ファイル末尾の b"" で停止するイテレータを使用"
for chunk in iter(lambda: f_in.read(chunk_size), b""):
    f_out.write(chunk)</pre>



<p class="wp-block-paragraph">具体的に圧縮書き込みをしている上記部分はイテレーターを活用している部分で少しだけ複雑なので丁寧に説明します。</p>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>iter(callable, sentinel)</code></span> は、Python 組み込み関数 <code>iter()</code> の特殊な使い方です。第 1 引数の <code>callable</code> に指定した関数を繰り返し呼び出し、その戻り値が <code>sentinel</code> と一致したタイミングで繰り返しを停止します。</p>



<p class="wp-block-paragraph"><code>file.read()</code> は、ファイル終端の EOF に到達すると <code>b""</code> を返却するため「EOF まで <code>chunk_size</code> ごとに <code>chunk</code> に読み込む」ための <code>for</code> 文になっています。</p>



<p class="wp-block-paragraph">なお、ここで指定している <code>chunk_size</code> は「読み込みの単位」であり、Zstandard の圧縮形式としてのブロックサイズとは関係ありません。<code>write()</code> をチャンク単位で呼び出していますが、これはデータを圧縮ストリームに順次渡すことを意味しており、<code>write()</code> を 1 回呼び出すたびに必ずしも圧縮先ファイルへ即座に書き込まれるわけではありません。圧縮処理では、内部でバッファリングが行われ、圧縮されたデータは適切な単位、タイミングでまとめて圧縮先ファイルに書き込まれます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ストリーミング解凍</h3>



<p class="wp-block-paragraph"><code>zstd</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 compression import zstd


def decompress_file(src_path: str, dst_path: str) -> None:
    """zstd圧縮ファイルをストリーム解凍する関数

    Args:
        src_path (str): 対象ファイル（.zst）のパス
        dst_path (str): 解凍先のファイルパス
    """
    # 1 MB のチャンクで処理
    chunk_size = 1024 * 1024  # 1MB

    # zstd で圧縮元ファイルを開いてストリーム解凍
    with zstd.open(src_path, "rb") as f_in:
        # 解凍先ファイルを開く
        with open(dst_path, "wb") as f_out:
            for chunk in iter(lambda: f_in.read(chunk_size), b""):
                f_out.write(chunk)


if __name__ == "__main__":
    source_path = "sample.log.zst"
    dest_path = "sample_restored.log"
    decompress_file(source_path, dest_path)</pre>



<p class="wp-block-paragraph">上記は、圧縮時と比べると入力（<code>f_in</code>）を <code>zstd.open()</code> で開いており、出力（<code>f_out</code>）を <code>open()</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="">import hashlib


def sha256(path: str) -> str:
    """ハッシュ値計算用

    Args:
        path (str): 対象ファイルのパス

    Returns:
        str: SHA256 ハッシュ値（16 進文字列）
    """
    h = hashlib.sha256()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(1024 * 1024), b""):
            h.update(chunk)
    return h.hexdigest()


if __name__ == "__main__":
    original_hash = sha256("sample.log")
    restored_hash = sha256("sample_restored.log")
    print(f"Original SHA256: {original_hash}")
    print(f"Restored SHA256: {restored_hash}")
    print("一致" if original_hash == restored_hash else "不一致")</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="">【実行結果】※ハッシュ値は対象ファイルにより変化します。
Original SHA256: 3fbff20cef2ac6b9a19f3399bb9ac58c603e597db79bb78332702bd48367b3ba
Restored SHA256: 3fbff20cef2ac6b9a19f3399bb9ac58c603e597db79bb78332702bd48367b3ba
一致</pre>



<p class="wp-block-paragraph">結果を見ると、処理前後でハッシュ値が一致していることが分かります。なお、ハッシュ値は対象ファイルにより変化しますので注意してください。</p>



<p class="wp-block-paragraph">このようにすることで、サイズの大きなファイルについてもメモリを節約しつつ圧縮／解凍することが可能になります。</p>



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



<p class="wp-block-paragraph">Python で <span class="jinr-d--text-color d--marker1 d--bold"><code>zstd</code> により Zstandard アルゴリズムを使ったデータ圧縮／解凍をする方法</span>の基本について解説しました。</p>



<p class="wp-block-paragraph">Zstandard は、Python 3.13 以前では、外部ライブラリとして pip でインストールをして使う必要がありましたが、Python 3.14 で標準ライブラリに追加され、<code>compression.zstd</code> を使ってデータを圧縮／解凍ができるようになりました。</p>



<p class="wp-block-paragraph">この記事では、一括で <code>bytes</code> データを圧縮／解凍する <code>compress()</code> / <code>decompress()</code> の使い方や <code>level</code> 指定による圧縮率の違いについて説明しました。また、大容量ファイルを扱う場合の、ストリーミング圧縮／解凍の方法についても紹介しています。</p>



<p class="wp-block-paragraph"><code>zstd</code> は高速かつ高圧縮な形式として普及が進んでおり、ログ圧縮やデータのアーカイブ用途でも非常に使いやすい選択肢です。ぜひ、<code>zstd</code> を有効活用してみてください。</p>



<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">上記で紹介しているソースコードについては&nbsp;<a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/zstd" target="_blank" rel="noreferrer noopener">GitHub</a>&nbsp;にて公開しています。参考にしていただければと思います。</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>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-zstd-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】テンプレート文字列 t-string の使い方</title>
		<link>https://tech.nkhn37.net/python-t-string-basic/</link>
					<comments>https://tech.nkhn37.net/python-t-string-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 22 Jan 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[文字列]]></category>
		<category><![CDATA[f-string]]></category>
		<category><![CDATA[Python 3.14]]></category>
		<category><![CDATA[t-string]]></category>
		<category><![CDATA[テンプレート文字列]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=13296</guid>

					<description><![CDATA[Python のテンプレート文字列（t-string）の使い方の基本について解説します。 テンプレート文字列 t-string テンプレート文字列 t-string とは t-string とは、Python 3.14  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の<span class="jinr-d--text-color d--marker1 d--bold">テンプレート文字列（t-string）</span>の使い方の基本について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">テンプレート文字列 t-string</h2>



<h3 class="wp-block-heading jinr-heading d--bold">テンプレート文字列 t-string とは</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">t-string</span> とは、Python 3.14 で新しく追加された<span class="jinr-d--text-color d--marker1 d--bold">テンプレート文字列</span>のための構文です。t-string は、以下のような文字列のことで、文字列をフォーマットするための f-string とよく似ていますが、最大の特徴は式の内容を保持したまま、文字列としてはまだフォーマットされない点です。</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="">t"Hello {name}"
</pre>



<p class="wp-block-paragraph">上記のように書いても <code>name</code> の値は即時に文字列には変換されません。t-string は、完成した文字列を作るものではなく、後から評価・処理されることを前提としたテンプレートを生成するものです。</p>



<p class="wp-block-paragraph">この記事では、テンプレート文字列 t-string の基本的な使い方や関連する型の構造などについて紹介します。</p>



<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">フォーマットのための f-string については「<a href="https://tech.nkhn37.net/python-str-format-f-string/" target="_blank" rel="noreferrer noopener">formatやf-stringを用いて文字列をフォーマットする方法</a>」を参考にしてください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">t-string を使用するには、Python 3.14 以降である必要があるので注意してください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">なぜ t-string が必要になるのか</h3>



<p class="wp-block-paragraph">t-string は、<a href="https://peps.python.org/pep-0750/" target="_blank" rel="noreferrer noopener">PEP 750</a> で提案されて取り込まれた構文です。文字列フォーマットのための f-string は非常に便利な構文ですが「文字列が即時評価される」という性質があり、もともとどういった文字列の中に何が埋め込まれたのかが後からは分からないという特徴があります。</p>



<p class="wp-block-paragraph">f-string は多くの場合で問題になりませんが、次のようなケースでは注意が必要です。</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>SQL や HTML に悪意のある文字列が取り込まれないように安全に処理したい。（SQL インジェクションやクロスサイトスクリプティング（XSS）の対策）</li>



<li>ユーザー入力を含む文字列をそのまま評価したくない。</li>



<li>ライブラリでテンプレートを引数で受け取り処理したい。</li>
</ul>
</div></div></section>



<p class="wp-block-paragraph">これまでは、上記には独自に対応する必要がありましたが、t-string は「文字列化されていないテンプレート」という概念を Python 標準の文法とし、この課題を解決するために導入されています。</p>



<h2 class="wp-block-heading jinr-heading d--bold">t-string の基本的な使い方</h2>



<h3 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h3>



<p class="wp-block-paragraph">t-string の基本構文は、文字列リテラルの前に「<code>t</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 main():
    user = "太郎"
    age = 30

    # t-string の使い方 例
    template = t"User: {user}, Age: {age}"

    # t-string の内容を表示
    print(f"template = {template}")

if __name__ == "__main__":
    main()</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="">【実行結果】
template = Template(strings=('User: ', ', Age: ', ''), interpolations=(Interpolation('太郎', 'user', None, ''), Interpolation(30, 'age', None, '')))</pre>



<p class="wp-block-paragraph">f-string と非常によく似ています。<code>{}</code> を使用してプレースホルダを記述し、用意した変数（例では、<code>user</code> や <code>age</code>）を渡します。</p>



<p class="wp-block-paragraph">返却値を <code>template</code> という変数に入れて表示してみていますが、<span class="jinr-d--text-color d--marker1 d--bold"><code>Template</code></span> 型になっているということが分かります。また、<code>Template</code> 型の中には、<span class="jinr-d--text-color d--marker1 d--bold"><code>Interpolation</code></span> 型というものも含まれることが分かります。これらの型については、後ほど説明していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">t-string は文字列に変換されない</h3>



<p class="wp-block-paragraph">t-string の使い方は、f-string と同様で非常に簡単ですが、上記の例のポイントとしては、<span class="jinr-d--text-color d--marker1 d--bold">t-string を用意した時点で中の式は自動的に文字列には変換されない</span>点です。上記の例でいうと <code>user</code> や <code>age</code> の値は取得されますが、文字列としては展開されません。</p>



<p class="wp-block-paragraph">t-string は式と文字列部分を分離したまま保持します。つまり、「文字列を作る」ためではなく、「文字列の設計図を作る」構文と理解すると分かりやすいかと思います。</p>



<p class="wp-block-paragraph">この性質により以下のようなメリットがあります。</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>意図しないコードの実行を防ぎセキュリティ上のリスクを下げる実装をすることができる。</li>



<li>評価タイミングを呼び出した側に委ねることができる。</li>
</ul>
</div></div></section>



<p class="wp-block-paragraph">このように、t-string は「安全に扱えるテンプレート」を実現できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">t-string の型を深堀する</h3>



<p class="wp-block-paragraph">f-string は結果として <code>str</code> となりますが、t-string は単なる <code>str</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 main():
    user = "太郎"
    age = 30
    height = 1.72

    # t-string を作成
    template = t"User={user!r}, Age next year={age + 1}, Height={height:.2f}m"

    # t-string の内容を表示
    print(f"template = {template}\n")

    # strings, interpolations, values の内容を表示
    print(f"template.strings = {template.strings}\n")

    print("template.interpolations:")
    for i, interp in enumerate(template.interpolations):
        print(f"  [{i}]")
        print(f"    value        = {interp.value!r}")
        print(f"    expression   = {interp.expression!r}")
        print(f"    conversion   = {interp.conversion!r}")
        print(f"    format_spec  = {interp.format_spec!r}\n")

    print(f"template.values = {template.values}")

if __name__ == "__main__":
    main()</pre>



<h4 class="wp-block-heading jinr-heading d--bold"><code>Template</code> 型</h4>



<p class="wp-block-paragraph">t-string の返却は、<span class="jinr-d--text-color d--marker1 d--bold"><code>Template</code></span> 型となっています。具体的には、<code>string.templatelib.Template</code> です。<code>Template</code> は以下の構造を持ちます。</p>



<ul class="wp-block-list jinr-list">
<li><code>strings</code>：テンプレート内の固定文字列部分のタプル</li>



<li><code>interpolations</code>：<code>strings</code> 要素間の補間データ（<code>Interpolation</code>）のタプル</li>



<li><code>values</code>：式を評価した結果の値のタプル</li>
</ul>



<p class="wp-block-paragraph">例の出力結果では以下のようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="abap" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">template.strings = ('User=', ', Age next year=', ', Height=', 'm')

template.interpolations:
  [0]
    value        = '太郎'
    expression   = 'user'
    conversion   = 'r'
    format_spec  = ''

  [1]
    value        = 31
    expression   = 'age + 1'
    conversion   = None
    format_spec  = ''

  [2]
    value        = 1.72
    expression   = 'height'
    conversion   = None
    format_spec  = '.2f'

template.values = ('太郎', 31, 1.72)</pre>



<p class="wp-block-paragraph">上記の結果を見てみると <code>len(strings) == len(interpolations) + 1</code> という関係が成り立っているので、<code>strings</code> の要素の間に <code>interpolations</code> が挟まれている構造になっていることが分かるかと思います。また、<code>values</code> で各変数の部分にどのような値が埋め込まれるのかを確認できます。 </p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>Interpolation</code> 型</h4>



<p class="wp-block-paragraph"><code>interpolations</code> の要素となっている <span class="jinr-d--text-color d--marker1 d--bold"><code>Interpolation</code></span> 型 についても要素を確認しておきましょう。具体的には、<code>string.templatelib.Interpolation</code> です。</p>



<ul class="wp-block-list jinr-list">
<li><code>value</code>：式を評価した結果の値</li>



<li><code>expression</code>：元の式を文字列として保持したもの</li>



<li><code>conversion</code>：変換指定子（<code>!r</code> / <code>!s</code> / <code>!a</code>）</li>



<li><code>format_spec</code>：書式指定文字列（<code>:</code> 以降に記載）</li>
</ul>



<p class="wp-block-paragraph"><code>value</code> は式を評価した結果の値を確認できます。また、結果がどのような式により計算されたかについては <code>expression</code> で文字列として確認できます。これは、式レベルで妥当性を評価する際に使用できます。</p>



<p class="wp-block-paragraph">変換指定子である <code>conversion</code> や書式指定文字列 <code>format_spec</code> は f-string でも指定できる要素です。t-string の特徴の通り、これらの変換はまだ適用されていません。テンプレートを受け取った側がどのような処理をするか判断をして使用します。</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"><strong>【変換指定子】</strong></p>



<p class="wp-block-paragraph">変換指定子は補間対象の値をどの文字列表現に変換するかを指定するための記法です。</p>



<ul class="wp-block-list jinr-list">
<li><code>!r</code>：<code>repr(value)</code></li>



<li><code>!s</code>：<code>str(value)</code></li>



<li><code>!a</code>：<code>ascii(value)</code></li>
</ul>



<p class="wp-block-paragraph"><strong>【書式指定文字列】</strong></p>



<p class="wp-block-paragraph">書式指定文字列は、数値や文字列の表示形式を細かく制御するための指定文字列です。以下は例になります。</p>



<ul class="wp-block-list jinr-list">
<li><code>.2f</code>：小数点以下 2 桁</li>



<li><code>&gt;10</code>：右寄せ・桁数 10</li>



<li><code>0=10</code>：ゼロ埋め・桁数 10</li>
</ul>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">t-string の使いどころ</h3>



<p class="wp-block-paragraph">t-string がテンプレートの構造を保持する構造であるということが分かったかと思います。f-string との使い分けを記載すると以下のようになります。</p>



<ul class="wp-block-list jinr-list">
<li>”最終的な文字列がほしい” ⇒ f-string</li>



<li>&#8220;文字列化前に、値を安全に処理したい&#8221; ⇒ t-string</li>
</ul>



<p class="wp-block-paragraph">例えば、ユーザー入力に対して SQL 実行や HTML レンダリングをするような関数やメソッドを作成したとしましょう。この時、引数に <code>str</code> を受け取ると、その文字列に悪意のある文字列が含まれているかを判断するのは大変です。</p>



<p class="wp-block-paragraph">このような際に、関数やメソッドの引数を t-string（<code>Template</code> 型）を受け取るような形式にしておけば、受け取った側で適切な処理をした上で文字列として活用することができ、SQL インジェクションや XSS の脆弱性に対策した処理をすることが可能です。</p>



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



<p class="wp-block-paragraph">Python の<span class="jinr-d--text-color d--marker1 d--bold">テンプレート文字列（t-string）</span>の使い方の基本について解説しました。</p>



<p class="wp-block-paragraph">t-string とは、Python 3.14 で新しく追加されたテンプレート文字列のための構文です。t-string は式と文字列部分を分離して保持し、まだ文字列として変換されていない構造を保持します。この性質により「意図しないコードの実行を防ぎセキュリティ上のリスクを防ぐ安全な処理を実装しやすい」「評価タイミングを呼び出した側に委ねることができる」といったメリットがあります。</p>



<p class="wp-block-paragraph">t-string は、<code>Template</code> 型となっており、<code>Interpolation</code> 型を含むような構造になっており、その概要についても紹介しました。</p>



<p class="wp-block-paragraph">t-string は、安全な関数やメソッドを構築する際に非常に便利なものであるため、うまく活用してみてほしいと思います。</p>



<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">上記で紹介しているソースコードについては&nbsp;<a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/string/t-string" target="_blank" rel="noreferrer noopener">GitHub</a>&nbsp;にて公開しています。参考にしていただければと思います。</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-t-string-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】tomllibでTOMLファイルを読み込む方法</title>
		<link>https://tech.nkhn37.net/python-tomllib-basic/</link>
					<comments>https://tech.nkhn37.net/python-tomllib-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 24 Dec 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[tomllib]]></category>
		<category><![CDATA[pyproject.toml]]></category>
		<category><![CDATA[TOML]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=13272</guid>

					<description><![CDATA[Python で TOML ファイルを読み込む際に使用する tomllib の基本的な使い方について解説します。 tomllib での TOML ファイルの読み込み TOML ファイルは、Tom&#8217;s Obvi [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python で <span class="jinr-d--text-color d--marker1 d--bold">TOML</span> ファイルを読み込む際に使用する <span class="jinr-d--text-color d--marker1 d--bold"><code>tomllib</code></span> の基本的な使い方について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>tomllib</code> での TOML ファイルの読み込み</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">TOML</span> ファイルは、<strong>Tom&#8217;s Obvious, Minimal Language</strong> という設定ファイルフォーマットの 1 種です。Tom というのは、開発者の Tom Preston-Werner 氏からとられています。名称にもあるようにミニマルであることを目指して開発されています。</p>



<p class="wp-block-paragraph">TOML ファイルは以下のような形式のファイルです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[DB_SERVER]
HOST = "192.168.1.200"
PORT = 3306

[WEB_SERVER]
HOST = "192.168.1.100"
PORT = 80</pre>



<p class="wp-block-paragraph">セクションは [] で表すことができ、数値はそのまま書けますが、文字列は必ずクォート (<code>"</code>) で囲う必要があります。</p>



<p class="wp-block-paragraph">TOML ファイルは、人が読み書きしやすいような構造となっており、プログラムでも安全に解析できます。Python では、PEP <a href="https://peps.python.org/pep-0517/" target="_blank" rel="noreferrer noopener">517</a> / <a href="https://peps.python.org/pep-0518/" target="_blank" rel="noreferrer noopener">518</a> で <code>pyproject.toml</code> が導入されプロジェクト設定や依存関係、ツール設定を一元化する役割を担っています。</p>



<p class="wp-block-paragraph">Python の設定ファイル管理では、古くからは INI ファイルが使われており、その後は、インフラや各種ツール設定を中心に YAML ファイルが広く使用されていますが、<code>pyproject.toml</code> の導入をきっかけにプロジェクトや開発ツール設定としてTOMLファイルの利用が急速に増えてきています。</p>



<p class="wp-block-paragraph">Python では以前は <code>toml</code> や <code>tomli</code> といった外部ライブラリが採用されていましたが、Python 3.11 より <span class="jinr-d--text-color d--marker1 d--bold"><code>tomllib</code></span> として標準ライブラリ化されたため、簡単に使用することができます。なお、<code>tomli</code> は <code>tomllib</code> の実装のベースとなっています。</p>



<p class="wp-block-paragraph">この記事では、<code>tomllib</code> を使って TOML ファイルを扱う方法を紹介します。</p>



<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">YAML ファイルや INI ファイルの Python での扱い方については、以下を参考にしてください。</p>



<ul class="wp-block-list jinr-list">
<li><a href="https://tech.nkhn37.net/python-yaml-basic/" target="_blank" rel="noreferrer noopener">PyYAMLでのYAMLファイル管理</a></li>



<li><a href="https://tech.nkhn37.net/python-configparser-basic/" target="_blank" rel="noreferrer noopener">configparserによる設定ファイル管理</a></li>
</ul>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold"><code>tomllib</code> の基本的な使い方（読み込み）</h3>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox1 ">
			<i class="jif jin-ifont-v2bulb" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>tomllib</code> は <span class="jinr-d--text-color d--marker1 d--bold">TOML ファイルの安全な読み込み</span>を目的とした標準ライブラリであり、書き込み機能は提供されていません。もともと TOML ファイルは、人が手で直す設定ファイル用途前提であり、<code>tomllib</code> は安全に読むことに責務を限定しています。</p>



<p class="wp-block-paragraph">公式ドキュメントで、<a href="https://pypi.org/project/tomli-w/" target="_blank" rel="noreferrer noopener">Tomli-W</a> や <a href="https://pypi.org/project/tomlkit/" target="_blank" rel="noreferrer noopener">tomlkit</a> といった書き込み用ライブラリも参考に紹介されていますが、本記事では紹介は省略します。</p>
</div>
		</div></section>



<p class="wp-block-paragraph"><code>tomllib</code> を使用した TOML ファイルの読み込みは以下のようにします。<code>config.toml</code> というファイルを用意して読み込んでいます。</p>



<p class="wp-block-paragraph"><strong><code>config.toml</code></strong></p>



<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="">[WEB_SERVER]
HOST = "192.168.1.100"
PORT = 80

[DB_SERVER]
HOST = "192.168.1.200"
PORT = 3306</pre>



<p class="wp-block-paragraph"><strong><code>tomllib_basic.py</code></strong></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="">import tomllib

# TOMLファイルの読み込み
with open("config.toml", "rb") as f:
    config = tomllib.load(f)

# 読み込んだデータの型を確認
print(type(config))

# 読み込んだ値の参照
print(config["WEB_SERVER"])
print(config["WEB_SERVER"]["HOST"])
print(config["WEB_SERVER"]["PORT"])

print(config["DB_SERVER"])
print(config["DB_SERVER"]["HOST"])
print(config["DB_SERVER"]["PORT"])</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="">【実行結果】
&lt;class 'dict'>
{'HOST': '192.168.1.100', 'PORT': 80}
192.168.1.100
80
{'HOST': '192.168.1.200', 'PORT': 3306}
192.168.1.200
3306</pre>



<p class="wp-block-paragraph">TOML ファイルの読み込みを行う場合には、<span class="jinr-d--text-color d--marker1 d--bold"><code>tomllib.load</code></span> 関数を使用します。ファイルはバイナリモード（<code>"rb"</code>）で <code>open</code> したオブジェクトを指定します。</p>



<p class="wp-block-paragraph"><code>"r"</code> 開いたオブジェクトでもいいかと思うかもしれませんが、<code>"r"</code> とした場合には以下の <code>TypeError</code> となります。</p>



<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="">TypeError: File must be opened in binary mode, e.g. use `open('foo.toml', 'rb')`</pre>



<p class="wp-block-paragraph">これは、TOML が UTF-8 固定の仕様であり、文字コード処理をライブラリ側で一貫して行うためです。</p>



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



<p class="wp-block-paragraph">Python で <span class="jinr-d--text-color d--marker1 d--bold">TOML</span> ファイルを読み込む際に使用する <span class="jinr-d--text-color d--marker1 d--bold"><code>tomllib</code></span> の基本的な使い方について解説しました。</p>



<p class="wp-block-paragraph">TOML は、Python におけるプロジェクト定義の pyproject.toml で使用されており、もちろん他の設定ファイル管理にも使用ができます。Python 3.11 からは、tomllib として標準ライブラリ化したため、より使用しやすくなりました。</p>



<p class="wp-block-paragraph"><code>tomllib</code> は人が手で直す設定ファイル用途前提であり、TOML ファイルの安全な読み込みを目的とした標準ライブラリであるため、書き込み機能は提供されていない点には注意が必要です。この記事では取り上げていませんが、公式ドキュメントで、<a href="https://pypi.org/project/tomli-w/" target="_blank" rel="noreferrer noopener">Tomli-W</a> や <a href="https://pypi.org/project/tomlkit/">tomlkit</a> といったライブラリが紹介されているので必要に応じて確認してください。</p>



<p class="wp-block-paragraph"><code>tomllib</code> を使って TOML ファイルを有効活用してもらえたらと思います。</p>



<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"><code>tomllib</code> の公式ドキュメントは<a href="https://docs.python.org/ja/3/library/tomllib.html" 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-libraries/tomllib" 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>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-tomllib-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>クリーンアーキテクチャ概要</title>
		<link>https://tech.nkhn37.net/clean-architecture-basics/</link>
					<comments>https://tech.nkhn37.net/clean-architecture-basics/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 05 Dec 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[クリーンアーキテクチャ]]></category>
		<category><![CDATA[SOLID原則]]></category>
		<category><![CDATA[ドメイン駆動設計]]></category>
		<category><![CDATA[依存性の注入]]></category>
		<category><![CDATA[依存性逆転の原則]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=12966</guid>

					<description><![CDATA[ソフトウェアアーキテクチャの 1 つとして有力な設計手法・アーキテクチャパターンであるクリーンアーキテクチャの概要を解説します。 クリーンアーキテクチャの概要 クリーンアーキテクチャとは クリーンアーキテクチャとは、Ro [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ソフトウェアアーキテクチャの 1 つとして有力な設計手法・アーキテクチャパターンである<span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>の概要を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャの概要</h2>



<h3 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャとは</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>とは、Robert C. Martin（Uncle Bob）氏が提唱した、ソフトウェアの設計手法・アーキテクチャパターンの 1 つです。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャの主な目的は、以下です。</p>



<ol class="wp-block-list jinr-list">
<li>疎結合になり、テストしやすい。</li>



<li>技術選択を後から変更しやすい。</li>



<li>ドメインのロジックの見通しがよくなる。</li>



<li>大規模・長期プロジェクトで特に力を発揮する。</li>
</ol>



<p class="wp-block-paragraph">クリーンアーキテクチャの考え方を採用することで「<span class="jinr-d--text-color d--marker1 d--bold">変更に強く、テストしやすく、長期運用に耐えうるシステム</span>」を作ることが可能になります。</p>



<p class="wp-block-paragraph">この記事では、クリーンアーキテクチャの概要について紹介します。</p>





<h2 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャの基礎となる 4 層</h2>



<p class="wp-block-paragraph">クリーンアーキテクチャ では、<span class="jinr-d--text-color d--marker1 d--bold">エンティティ (Entities)</span> / <span class="jinr-d--text-color d--marker1 d--bold">ユースケース (Use Cases)</span> / <span class="jinr-d--text-color d--marker1 d--bold">インターフェースアダプター (Interface Adapters)</span> / <span class="jinr-d--text-color d--marker1 d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</span> という 4 つの代表的な層（レイヤ）があります。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャは、以下のような図で表現されます。まずは、それぞれの層について概要を説明していきます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="566" src="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png" alt="クリーンアーキテクチャ概要図" class="wp-image-12985" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-300x166.png 300w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-768x424.png 768w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2.png 1224w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">クリーンアーキテクチャ概要図</figcaption></figure>
</div>


<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox1 ">
			<i class="jif jin-ifont-v2bulb" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">上記図はクリーンアーキテクチャの説明で使われる代表的な層（レイヤ）を表します。クリーンアーキテクチャの層（レイヤ）の数は状況に応じて変わっても問題はありません。どういった考え方が軸となっているのかという本質を理解することに重点をおいてみてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">エンティティ (Entities)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">エンティティ (Entities)</span> は、企業のビジネスルールのデータをまとめてカプセル化したデータ構造のことを言います。このエンティティは、メソッドを持ったオブジェクトなどであり、企業の様々なアプリケーションから利用されるものです。</p>



<p class="wp-block-paragraph">機能の追加や UI の変更があっても、ビジネス上で中核となるデータ構造は比較的安定しているため、エンティティは外側の変更の影響を受けにくい層になります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ユースケース (Use Cases)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">ユースケース (Use Cases)</span> は、アプリケーション固有のビジネスルールを定義する層です。ユースケースでは、エンティティのデータをもとに目的を達成するための機能を実装します。</p>



<p class="wp-block-paragraph">この層は、データベースや UI、その他のフレームワークといった外部の変更から影響を受けることはありません。例えば、データベースが Oracle だとしても、PostgreSQL であったとしても、その上でユースケースとして実装する機能にとってはどちらでもいいのです。</p>



<p class="wp-block-paragraph">ただし、アプリケーションの画面などの操作変更により、ユースケースに手を加えなければいけないということはあり得ます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">インターフェースアダプター (Interface Adapters)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">インターフェースアダプター (Interface Adapters)</span> は、エンティティやユースケースにとって便利なデータフォーマットと、データベースや UI などにとって便利なフォーマットとの間の変換をするためのアダプターです。</p>



<p class="wp-block-paragraph">インタフェースアダプター層が変換を担うため、ユースケースの層では、外部のデータ構造を意識する必要がなくなります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</span> は、円の最も外側で最も詳細な部分です。これらは、DB や UI 等の外部インターフェースに関する機能です。</p>



<p class="wp-block-paragraph">例えば、DB アクセス用のライブラリやデバイスのための制御プログラムなどがこの層に該当します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">SOLID 原則とクリーンアーキテクチャ</h2>



<h3 class="wp-block-heading jinr-heading d--bold">SOLID 原則</h3>



<p class="wp-block-paragraph">クリーンアーキテクチャを理解する上で重要な原則に「<span class="jinr-d--text-color d--marker1 d--bold">SOLID 原則</span>」があります。SOLID とは、Robert C. Martin（Uncle Bob）氏が提唱した 保守性と拡張性の高い設計を行うための 5 つの原則 をまとめたものです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>原則</th><th>名称</th><th>概要</th></tr></thead><tbody><tr><td>S</td><td>単一責任の原則<br>(SRP: Single Responsibility Principle)</td><td>各モジュールを変更する理由がたった 1 つだけになるようにすること</td></tr><tr><td>O</td><td>開放閉鎖の原則<br>(OCP: Open-Closed Principle)</td><td>既存のコード変更よりも新しいコードの追加によってシステムの変更ができるようにすること</td></tr><tr><td>L</td><td>リスコフの置換原則<br>(LSP: Liskov Substitution Principle)</td><td>インターフェースで抽象化されたコンポーネントで安全に交換可能となっていること</td></tr><tr><td>I</td><td>インターフェース分離の法則<br>(ISP: Interface Segregation Principle)</td><td>用途ごとにインターフェースが分離して定義されていること</td></tr><tr><td>D</td><td>依存性逆転の原則<br>(DIP: Dependency Inversion Principle)</td><td>上位レベルの実装コードが下位レベルの詳細の実装コードに依存するのではなく、逆に詳細側が上位の方針に依存するべきであること</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">各原則の細かな説明についてはしませんが、SOLID 原則の中でもクリーンアーキテクチャで特に重要な原則である「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の法則 (DIP)</span>」については、この記事で考え方を紹介します。</p>



<p class="wp-block-paragraph">その他の設計原則については、書籍「<strong>Clean Architecture 達人に学ぶソフトウェアの構造と設計</strong>」を参考にしてください。</p>





<h3 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャで特に重要な依存性の方向（DIP)</h3>



<p class="wp-block-paragraph">上記で紹介した SOLID 原則は、いずれも重要な設計原則ですが、その中でもクリーンアーキテクチャを考えるうえで特に重要な原則が「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の原則 (DIP: Dependency Inversion Principle)</span>」です。以降、DIPと略します。</p>



<p class="wp-block-paragraph">プログラミングでは、何も考えずに実装を始めると図でいう外側に依存するようなプログラミングをよくしてしまいます。しかし、DIP では、依存の向きを図における内側、つまり Entities 方向に向けることが重要であると言っています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="566" src="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png" alt="クリーンアーキテクチャ概要図" class="wp-image-12985" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-300x166.png 300w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-768x424.png 768w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2.png 1224w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">クリーンアーキテクチャ概要図（再掲）</figcaption></figure>
</div>


<p class="wp-block-paragraph">依存方向とは、「どちらの変更がどちらに影響するか」を示します。Python を例にすると A が B をインポートしているとき、A は B の変更の影響を受けるため A は B に依存していると言います。矢印としては A → B となります。</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="">import module</pre>



<p class="wp-block-paragraph">例えば、上記例のように <code>module</code> モジュールをインポートしているプログラムは <code>module</code> に依存します。これは <code>module</code> での変更が当該プログラムに影響を与える可能性があるということです。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャにおいては、Entities や UseCases といった、企業のビジネスルールやアプリケーションのルールが、詳細である外側の層から影響を受けてはいけないということを言っています。</p>



<p class="wp-block-paragraph">なかなかイメージが難しいと思いますので、DIP に反する依存関係の例と DIP に従っている例を見ながら考えてみましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">DIP に反する依存関係の例</h4>



<p class="wp-block-paragraph">以降では、ユーザー情報を DB に登録するような例を使って紹介していきます。まずは、依存関係が DIP に反する例を見てみましょう。</p>



<p class="wp-block-paragraph">以下は、ユーザー情報を定義した <code>User</code> クラスがあり、<code>CreateUserUseCase</code> クラスで PostgreSQL にユーザー登録している場合です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="281" height="461" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93.webp" alt="依存性逆転の原則 (DIP) に反する例" class="wp-image-13109" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93.webp 281w, https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93-183x300.webp 183w" sizes="(max-width: 281px) 100vw, 281px" /></figure>
</div>


<p class="wp-block-paragraph">この例では、<code>CreateUserUseCase</code> → <code>PostgreSqlUserRepository</code> → <code>PostgreSqlDriver</code> というように内側から外側に向かう依存関係となっています。</p>



<p class="wp-block-paragraph">この場合、<code>PostgreSqlDriver</code> が変更されると <code>PostgreSqlUserRepository</code> の変更が必要になる可能性があり、その次には、<code>CreateUserUseCase</code> クラスの実装まで変更が波及する可能性があります。</p>



<p class="wp-block-paragraph">詳細である DB 管理が変更されても、ユースケース自体が何も変更されているわけでもないのにプログラムの修正が必要になってしまうかもしれないわけです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">依存関係の理想（DIP）</h4>



<p class="wp-block-paragraph">では、次に DIP がどのようにこの問題を解決するのかを見てみましょう。以下が、DIPを考慮した場合のクラス図の例です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="281" height="621" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436.webp" alt="依存性逆転の原則 (DIP) の例" class="wp-image-13110" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436.webp 281w, https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436-136x300.webp 136w" sizes="(max-width: 281px) 100vw, 281px" /></figure>
</div>


<h5 class="wp-block-heading jinr-heading d--bold">抽象化されたインターフェース</h5>



<p class="wp-block-paragraph">DIP でポイントとなるのは、抽象化されたインターフェースの使用です。</p>



<p class="wp-block-paragraph">例では、UseCases 層で Interface Adapters 層 で実装するべきインターフェース (<code>UserRepository</code>) を定義します。Interface Adapters 層側では、そのインターフェースに従うように <code>PostgreSqlUserRepository</code> の具体的な実装を行います。UseCases 層では、<code>CreateUserUseCase</code> → <code>UserRepository</code> に依存（矢印）が向いているように、具体的な実装ではなく抽象化されたインターフェースに依存します。</p>



<p class="wp-block-paragraph">同様に、Interface Adapters 層でもインターフェース (<code>DbDriver</code>) を定義し、Frameworks &amp; Drivers 層の <code>PostgreSqlDriver</code> が、そのインターフェースに従って具体的な実装を行います。<code>PostgreSqlUserRepository</code> は 抽象化されたインターフェースである <code>DbDriver</code> に依存します。 </p>



<p class="wp-block-paragraph">この例で、各層の間の矢印を確認してみてください。先ほどの DIP に反した例とは依存関係の矢印が逆向きになっています。これが、<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転</span>と言われる理由です。この逆転のためには、抽象化されたインターフェースがポイントとなります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">依存性の注入</h5>



<p class="wp-block-paragraph">DIP での構成が優れているところは、各層が自身の層で定義したインターフェースで定義された機能の仕様のみ知っておけばよいということです。ここで、仕様と言っているのは、例えば、メソッドの引数、戻り値、それらの型だと思ってください。外側の具体的実装は、そのインターフェースに従うように実装されるため、具体的な詳細まで知る必要がありません。</p>



<p class="wp-block-paragraph">例では PostgreSql を想定したクラスを例示していますが、<code>UserRepository</code> というインターフェースに従ったクラス（例えば、<code>OracleUserRepository</code> や <code>MySqlUserRepository</code> など）を作成すれば、そのクラスはインターフェース仕様で決められた引数や戻り値、型を持つ機能を実装しているため、付け替えも容易です。</p>



<p class="wp-block-paragraph">インターフェースを使うため、テスト時にドライバーやスタブを用意しやすい点も重要な特徴です。また、DBMS などの詳細技術が決まっていない段階では、技術の選択を後回しにしてビジネスロジックの開発を進められるという利点があります。</p>



<p class="wp-block-paragraph">内側の関数やメソッドでは、抽象化されたインターフェースを呼び出すように開発されるため、具体的にインスタンス化するクラスを変更するだけで簡単に実装の変更ができます。このようにどの具象クラスを使うかを外側から渡す方法を「<span class="jinr-d--text-color d--marker1 d--bold">依存性の注入（DI: Dependency Injection）</span>」と言います。DI は、DIP の考え方を現実のコードで実現する代表的な手法の 1 つです。</p>



<p class="wp-block-paragraph">例のクラス図での UseCases 層と Interface Adapters 層の間の関係性をイメージして、実際に簡単なコードイメージを見てみましょう。</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=""># interface.py
from abc import ABC, abstractmethod

class UserRepository(ABC):

    @abstractmethod
    def save(self, user_name: str) -> None:
        ...</pre>



<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=""># postgresql_repository.py
from interface import UserRepository

class PostgreSqlUserRepository(UserRepository):

    def save(self, user_name: str) -> None:
        print(f"[PostgreSQL] save user: {user_name}")
        # ※本当は具体的な登録処理が実行される</pre>



<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=""># usecase.py
from interface import UserRepository

class CreateUserUseCase:

    def __init__(self, repo: UserRepository):
        self.repo = repo  # 抽象に依存

    def execute(self, user_name: str):
        # 具体的なDB処理は知らない
        self.repo.save(user_name)</pre>



<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=""># main.py
from usecase import CreateUserUseCase
from postgresql_repository import PostgreSqlUserRepository

def main():
    repo = PostgreSqlUserRepository()   # ここで具体を選択（OracleUserRepository に変えれば Oracle に切替が簡単にできる）
    usecase = CreateUserUseCase(repo)   # 依存性の注入（内側へ注入）
    usecase.execute("Taro")

if __name__ == "__main__":
    main()</pre>



<p class="wp-block-paragraph"><code>UserRepository</code> という抽象クラスをインターフェースとして用意し、それを継承して、<code>PostgreSqlUserRepository</code> を作成しています。<code>CreateUserUseCase</code> クラスは実際にユーザーを作成・登録するためのユースケースだと思ってください。 </p>



<p class="wp-block-paragraph">上記でのポイントは、<code>CreateUserUseCase</code> のコンストラクタ <code>__init__</code> が、抽象の <code>UserRepository</code> を引数に取っている点です。これは、ユースケースが、具体的に PostgreSQL を使うのか、Oracle を使うのかといった具体的なことは全く意識していないということを意味しています。</p>



<p class="wp-block-paragraph">具体的にどの実装を使うかはエントリポイントである <code>main</code> 関数で選択しています。<code>CreateUserUseCase</code> のインスタンス化で <code>PostgreSqlUserRepository</code> のインスタンスを渡しています。これが、依存性を注入している部分です。</p>



<p class="wp-block-paragraph">このようにしておくと DB を Oracle に変えたければ、<code>UserRepository</code> を実装した <code>OracleUserRepository</code> を作成し、<code>main</code> 関数でインスタン化するクラスを変えれば、技術の付け替えが完了します。この時には、<code>main</code> 関数のみに変更を加えればよく、 <code>usecase.py</code> を変更する必要が全くないことが非常に重要なことです。</p>



<p class="wp-block-paragraph">上記で見てきたように DIP の考え方に従うロジックの見通しがよくなり、テストがしやすく、技術選択も後から変更しやすいシステムを構築できます。これにより、特に大規模・長期のプロジェクトでは、改修・維持・管理といった負担が軽減されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">依存関係の現実</h4>



<p class="wp-block-paragraph">DIP の考え方について紹介しましたが、現実の場面では少し柔軟性を持って考える必要が出てくる場合があります。以下は、Frameworks &amp; Drivers の層として、PostgreSQL を扱うためのモジュールである psycopg2 を使っている例です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="282" height="542" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa.webp" alt="依存性逆転の原則 (DIP) の現実" class="wp-image-13111" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa.webp 282w, https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa-156x300.webp 156w" sizes="(max-width: 282px) 100vw, 282px" /></figure>
</div>


<p class="wp-block-paragraph">psycopg2 は、コミュニティで開発されているため、自分たちで定義した Interface Adapters 層のインターフェースに従うように機能を実装してもらうことは困難です。そのため、アダプターから psycopg2 への依存はどうしても発生します。</p>



<p class="wp-block-paragraph">ただし、この依存は外側の詳細同士の依存であり、内側の Entity や UseCase からは、psycopg2 が見えていない限り、DIP の本質は守られていると言えます。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャでは、DIP を完全に実現することが目的ではなく、重要なビジネスルール（Entity や UseCase）を外部の詳細から守ることがより重要です。</p>



<p class="wp-block-paragraph">もちろん Frameworks &amp; Drivers 層の機能も自分たちで開発する場合は、DIP に従うように考えるのがベストですが、世の中にある便利なモジュールを使うことは、開発コストを抑えることができて合理的な場合も多くあります。原則にこだわりすぎるのではなく、柔軟な考え方でアーキテクチャを検討するようにしましょう。</p>



<h2 class="wp-block-heading jinr-heading d--bold">ドメイン駆動設計（DDD）との関係</h2>



<p class="wp-block-paragraph">システムの設計では、<span class="jinr-d--text-color d--marker1 d--bold">ドメイン駆動設計（DDD: Domain Driven Design）</span>という設計思想があります。エリック・エヴァンス（Eric Evans）氏が提唱したもので、クリーンアーキテクチャと一緒に語られることが多く、混同されやすいため簡単に整理しておきます。</p>



<p class="wp-block-paragraph">ドメイン駆動設計は、複雑なビジネスドメインをどのように定義し、正しくモデル化することを目的にした設計思想のことです。一方で、クリーンアーキテクチャは、主にソフトウェアをどのような構造で分割するかといった、システムアーキテクチャの設計手法になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>クリーンアーキテクチャ</th><th>ドメイン駆動設計（DDD）</th></tr></thead><tbody><tr><td>アプリケーションの構造を整理することが目的</td><td>ビジネスドメインを正しく表現することが目的</td></tr><tr><td>層構造や依存方向を重視</td><td>ドメインモデルの表現を重視</td></tr><tr><td>システムアーキテクチャの話</td><td>モデリングの考え方（設計思想）</td></tr><tr><td>多くの種類のアプリケーションに適用しやすい</td><td>大規模・複雑なドメインで特に有効</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ドメイン駆動設計の文脈で出てくる概念をアーキテクチャとして実現する際に、クリーンアーキテクチャの考え方は適用しやすいため、両者は目的は明確に異なりますが、併用されて力を発揮することが多いです。</p>



<p class="wp-block-paragraph">ドメイン駆動設計に関する書籍としては「<strong>エリック・エヴァンスのドメイン駆動設計</strong>」「<strong>ドメイン駆動設計をはじめよう</strong>」「<strong>ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本</strong>」を参考にしてみてください。</p>









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



<p class="wp-block-paragraph">ソフトウェアアーキテクチャの 1 つとして有力な<span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>の概要を解説しました。クリーンアーキテクチャの考え方を採用すると変更に強い、長期運用に耐えうるシステムの開発が可能となります。</p>



<p class="wp-block-paragraph">この記事では、クリーンアーキテクチャの基本的な概念である 4 つの層の考え方や、アーキテクチャ設計原則である SOLID 原則を紹介しました。また、設計原則の中でも特に中心となる「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の原則 (DIP: Dependency Inversion Principle)</span>」について少し深堀をして紹介しました。</p>



<p class="wp-block-paragraph">プログラミングは文法を覚えるだけでは、良いシステムを開発できるとは限りません。システムアーキテクチャの理解は、学習コストも高く、解釈も人により微妙に異なる場合がある領域かと私は思っています。また、正解のアーキテクチャが決まっているわけではなく、適用するシステムの特徴に合わせて最適なアーキテクチャを十分に検討する必要があるため、非常に難しい領域だと思っています。</p>



<p class="wp-block-paragraph">この記事を参考にしていただいて、自分の中でシステムアーキテクチャの最適な考え方や理解に落とし込んでいただければと思います。</p>


<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/clean-architecture-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】python-oracledbでOracleに接続して操作する方法（サンプルコード付き）</title>
		<link>https://tech.nkhn37.net/python-oracledb-oracle-connection/</link>
					<comments>https://tech.nkhn37.net/python-oracledb-oracle-connection/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 05 Jul 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[oracledb]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[python-oracledb]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=12323</guid>

					<description><![CDATA[python-oracledb を用いて Oracle データベースへ接続して操作をする方法を解説します。 Python で Oracle データベースへ接続する python-oracledb とは？ python-o [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><span class="marker"><strong>python-oracledb</strong></span> を用いて Oracle データベースへ接続して操作をする方法を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Python で Oracle データベースへ接続する</h2>



<h3 class="wp-block-heading jinr-heading d--bold">python-oracledb とは？</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>python-oracledb</strong></span> は、以前広く使われていて cx_Oracle の後継として Oracle 社が提供する公式の Python ライブラリです。ライブラリ名はシンプルに「<span class="marker"><strong><code>oracledb</code></strong></span>」です。これにより、Oracle データベースに対して Python から簡単に接続・操作することができます。</p>



<p class="wp-block-paragraph">大きな特徴は、Oracle Client が不要な Thin モードに対応しており、手軽に導入ができる点です。一方で、従来の cx_Oracle 同様の機能を活用したい場合は、Thick モードを使用します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">以前は Python で Oracle 接続といえば cx_Oracle でしたが、現在は非推奨となっているため、新規開発には使用しないようにしましょう。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold"><code>oracledb</code> のインストール方法</h3>



<p class="wp-block-paragraph"><code>oracledb</code> ライブラリは、PyPI で公開されており、以下のように pip install コマンドで簡単にインストールできます。</p>



<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="">pip install oracledb</pre>



<h3 class="wp-block-heading jinr-heading d--bold">Thin モードと Thick モードの違いと選び方</h3>



<p class="wp-block-paragraph"><code>oracledb</code> は、Thin モードと Thick モードの2つの動作モードを提供しています。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>モード</th><th>特徴</th><th>Oracle Client</th></tr></thead><tbody><tr><td>Thin</td><td>軽量・インストール簡単で基本機能をカバー</td><td>不要</td></tr><tr><td>Thick</td><td>高機能であり、従来のcx_Oracle互換</td><td>必要</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Thin モードは Oracle Client も不要でとても便利です。Thin モードで問題ない場合は、そのままで十分ですが Advanced Queuing などの Oracle 特有機能を使いたい場合には、Thick モードの使用を検討する必要があります。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>oracledb</code> を用いたサンプルプログラム</h2>



<p class="wp-block-paragraph">以降では、<code>oracledb</code> を用いて Oracle データベースへアクセスするためのサンプルプログラムを紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">前提条件</h3>



<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>Python 3.7 以降、無償版の OracleXE がローカルPCにインストールされているものとします。（製品版の Oracle でも問題ありません。)</li>



<li>サービスは、Oracle XE デフォルトとして作成される <code>XEPDB1</code> を使用しています。お使いの環境のサービスにあわせて変更してください。</li>



<li>ユーザーとして <code>TEST</code> が作成されておりパスワードは <code>PAssw0rd</code> としています。お使いの環境にあわせて変更してください。</li>



<li>使用するユーザーには、データベースへのアクセス、テーブル作成、データ登録、検索といった権限が付与されているものとします。</li>



<li>DB接続クラスは <code>db_connect_oracle.py</code> に、設定情報は <code>dbconfig.ini</code> として、<code>dbconfig.ini</code> は、Pythonプログラムと同フォルダに配置とします。</li>
</ul>
</div></div></section>



<h3 class="wp-block-heading jinr-heading d--bold">サンプルコード</h3>



<h4 class="wp-block-heading jinr-heading d--bold">設定ファイルおよびDBアクセスクラス定義</h4>



<p class="wp-block-paragraph"><code>oracledb</code> を使用して Oracle データベースへアクセスするための設定ファイルとDBアクセス用クラスの例は以下のようになります。設定ファイルの内容はお使いの環境にあわせて修正してください。</p>



<h5 class="wp-block-heading jinr-heading d--bold">【<code>dbconfig.ini</code>】DBアクセス設定ファイル</h5>



<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="">[ORACLE_DB_SERVER]
host = localhost
port = 1521
service = XEPDB1
user = TEST
password = PAssw0rd</pre>



<h5 class="wp-block-heading jinr-heading d--bold">【<code>db_connect_oracle.py</code>】DBアクセスクラス</h5>



<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="">import configparser

import oracledb


class DbConnectOracle:
    """Oracle DBアクセスクラス"""

    def __init__(self, mode: str = "thin", client_lib_dir: str = None) -> None:
        """コンストラクタ

        Args:
            mode: "thin" または "thick"
            client_lib_dir: Thick モードの場合は、Oracle Client のライブラリパス
        """
        # モード判定
        if mode == "thick":
            if client_lib_dir is None:
                raise ValueError(
                    "Thick モードでは client_lib_dir の指定が必要です。"
                )
            oracledb.init_oracle_client(client_lib_dir)
        elif mode != "thin":
            raise ValueError(
                "mode は、'thin' または 'Thick' を指定してください。"
            )

        # iniファイルの読み込み
        config_db = configparser.ConfigParser()
        config_db.read("dbconfig.ini")

        # 設定の読み込み
        host = config_db["ORACLE_DB_SERVER"]["host"]
        port = int(config_db["ORACLE_DB_SERVER"]["port"])
        service_name = config_db["ORACLE_DB_SERVER"]["service"]
        user = config_db["ORACLE_DB_SERVER"]["user"]
        password = config_db["ORACLE_DB_SERVER"]["password"]

        # DSN の作成
        self.dsn = oracledb.makedsn(host, port, service_name=service_name)

        # 接続の確立
        self.con = oracledb.connect(
            user=user,
            password=password,
            dsn=self.dsn,
        )
        self.cursor = self.con.cursor()

    def execute_non_query(self, sql: str, bind_var: dict = None) -> None:
        """SQL 実行メソッド
        (CREATE / INSERT / UPDATE / DELETE 用)

        Args:
            sql: 実行SQL
            bind_var: バインド変数

        Returns: None

        """
        # SQLの実行
        if bind_var is None:
            self.cursor.execute(sql)
        else:
            # バインド変数がある場合は指定して実行
            self.cursor.execute(sql, bind_var)

    def execute_query(
        self, sql: str, bind_var: dict = None, count: int = 0
    ) -> list:
        """SQL 実行メソッド
        (SELECT 用)

        Args:
            sql: 実行SQL
            bind_var: バインド変数
            count: データ取得件数

        Returns: 取得結果リスト

        """
        # SQLの実行
        if bind_var is None:
            self.cursor.execute(sql)
        else:
            # バインド変数がある場合は指定して実行
            self.cursor.execute(sql, bind_var)

        columns = [col[0] for col in self.cursor.description]
        self.cursor.rowfactory = lambda *args: dict(zip(columns, args))

        # 取得結果を返却 (件数指定がある場合は、指定された件数分返却)
        return (
            self.cursor.fetchall()
            if count == 0
            else self.cursor.fetchmany(count)
        )

    def commit(self) -> None:
        """コミット

        Returns: None

        """
        self.con.commit()

    def rollback(self) -> None:
        """ロールバック

        Returns: None

        """
        self.con.rollback()

    def __del__(self) -> None:
        """デストラクタ

        Returns: None

        """
        self.cursor.close()
        self.con.close()


if __name__ == "__main__":
    pass</pre>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">細かな例外処理はしていませんのでご注意ください。プログラムを参考にして使用いただいてもかまいませんが、例外処理は細部検討いただき、ご自身の責任でご利用をお願いします。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">使用例（Thin モード）</h4>



<p class="wp-block-paragraph"><code>oracledb</code> の Thin モードを使用して上記で作成したクラスを用いてOracleへの接続をするには以下のように使用します。</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 db_connect_oracle import DbConnectOracle


def main():
    # Thin モードでアクセスする場合
    db_oracle = DbConnectOracle()

    # ===== テーブルを作成する
    create_sql = (
        "CREATE TABLE SAMPLE_TABLE"
        "("
        "ID NUMBER GENERATED ALWAYS AS IDENTITY,"
        "STR1 VARCHAR2(50), "
        "VALUE1 NUMBER, "
        "LAST_UPDATE_DATETIME TIMESTAMP, "
        "PRIMARY KEY (ID)"
        ")"
    )
    db_oracle.execute_non_query(create_sql)
    # コミット
    db_oracle.commit()

    # ===== データをINSERTする
    insert_sql = (
        "INSERT INTO SAMPLE_TABLE "
        "(STR1, VALUE1, LAST_UPDATE_DATETIME) "
        "VALUES(:str1, :val1, CURRENT_TIMESTAMP)"
    )
    for i in range(5):
        input_str = f"test_str{i}"
        input_val = 10 * i
        bind = {"str1": input_str, "val1": input_val}
        db_oracle.execute_non_query(insert_sql, bind)
    # コミット
    db_oracle.commit()

    # ===== データを検索する (全て検索)
    print("===== 全件検索")
    select_sql = "SELECT * FROM SAMPLE_TABLE"
    select_result = db_oracle.execute_query(select_sql)
    print(select_result)

    # ===== 件数を指定して検索する (以下の例は3件)
    print("===== 取得する件数の指定")
    select_sql = "SELECT * FROM SAMPLE_TABLE"
    select_result = db_oracle.execute_query(select_sql, count=3)
    print(select_result)

    # ===== 条件を指定して検索する
    print("===== 条件を指定して実行する")
    select_sql = "SELECT * FROM SAMPLE_TABLE WHERE VALUE1 > :val1"
    print("条件１")
    select_result = db_oracle.execute_query(select_sql, {"val1": 10})
    print(select_result)
    print("条件２")
    select_result = db_oracle.execute_query(select_sql, {"val1": 30})
    print(select_result)


if __name__ == "__main__":
    main()
</pre>



<h4 class="wp-block-heading jinr-heading d--bold">使用例（Thick モード）</h4>



<p class="wp-block-paragraph"><code>oracledb</code> の Thick モードを使用する場合には、クラスをインスタンス化する際に以下の引数を設定してください。</p>



<ul class="wp-block-list jinr-list">
<li><code>mode</code>：<code>"thick"</code></li>



<li><code>client_lib_dir</code>：Oracleクライアントライブラリが格納されているパス</li>
</ul>



<p class="wp-block-paragraph">以下の例では、Oracle の Instant Client (軽量版クライアント) を使用した場合の例です。フルのOracle Clientの場合は、環境にあわせて <code>r"C:\oracle\product\19.0.0\client_1\bin"</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 db_connect_oracle import DbConnectOracle


def main():
    mode = "thick"
    client_lib_dir = r"C:\oracle\instantclient_21_18"

    # Thick モードでアクセスする場合
    db_oracle = DbConnectOracle(
        mode=mode,
        client_lib_dir=client_lib_dir,
    )

    # 以降は、Thin モードと同じ
    # ・・・


if __name__ == "__main__":
    main()</pre>



<h3 class="wp-block-heading jinr-heading d--bold">サンプルコードのポイント解説</h3>



<h4 class="wp-block-heading jinr-heading d--bold">DBアクセス用クラス <code>DBConnectOracle</code></h4>



<p class="wp-block-paragraph">DBアクセス用のクラスとして <code>DbConnectOracle</code> というクラスを定義しています。メソッドとして定義しているものは以下になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>メソッド名</th><th>概要</th></tr></thead><tbody><tr><td><code>__init__</code></td><td>コンストラクタでデフォルトは Thin モードでDBのコネクション確立とカーソル作成を行います。Thick モードで使う場合は、<code>mode</code> の指定と Oracle Client のライブラリパスの指定が必要です。</td></tr><tr><td><code>execute_non_query</code></td><td>CREATE / INSERT / UPDATE / DELETEの処理用のSQL実行メソッドです。SQL文と必要に応じてバインド変数を渡して処理を実行します。</td></tr><tr><td><code>execute_query</code></td><td>SELECT 用の SQL 実行メソッドです。返却値は辞書 (<code>dict</code>) のリストになります。SQL 文と必要に応じてバインド変数、データ取得件数を渡して処理を実行します。</td></tr><tr><td><code>commit</code></td><td>コミットして変更内容を確定します。</td></tr><tr><td><code>rollback</code></td><td>ロールバックして変更内容を破棄します。</td></tr><tr><td><code>__del__</code></td><td>デストラクタです。接続終了時にデータベースのカーソルとコネクションをクローズします。</td></tr></tbody></table></figure>



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



<p class="wp-block-paragraph"><span class="marker"><strong>python-oracledb</strong></span> を用いてOracleデータベースへアクセスする方法について解説しました。</p>



<p class="wp-block-paragraph">このライブラリは、Oracle 公式であり、Oracle アクセス手段として非常に強力です。これまで使われていた cx_Oracle の後継として使用することができます。</p>



<p class="wp-block-paragraph">Thin モードと Thick モードが用意されており、Thin モードではOracle Client不要で手軽に使用することができます。また、高度な機能が必要であれば Thick モードの使用を検討してください。</p>



<p class="wp-block-paragraph">この記事では、汎用的に使えるDBアクセスクラスを作成して OracleDB へのアクセスをできるようにしてみました。ぜひ、参考にしていただいて Oracle 接続に活用していただければと思います。</p>



<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-libraries/oracledb" 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-oracledb-oracle-connection/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【因果推論】エスティマンドの概念</title>
		<link>https://tech.nkhn37.net/causal-estimand-basics/</link>
					<comments>https://tech.nkhn37.net/causal-estimand-basics/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 21:59:00 +0000</pubDate>
				<category><![CDATA[因果推論]]></category>
		<category><![CDATA[ATE]]></category>
		<category><![CDATA[ATT]]></category>
		<category><![CDATA[ATU]]></category>
		<category><![CDATA[CATE]]></category>
		<category><![CDATA[エスティマンド]]></category>
		<category><![CDATA[処置群]]></category>
		<category><![CDATA[対照群]]></category>
		<category><![CDATA[平均因果効果]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=12266</guid>

					<description><![CDATA[因果推論において重要な概念であるエスティマンドの概念について解説します。 エスティマンドの概要 因果推論は、ある処置（介入）を行った際に出力に与える影響を推定するための手法です。ここで処置（介入）とは、例えば治療や政策介 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">因果推論において重要な概念である<span class="jinr-d--text-color d--marker1 d--bold">エスティマンド</span>の概念について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">エスティマンドの概要</h2>



<p class="wp-block-paragraph">因果推論は、ある処置（介入）を行った際に出力に与える影響を推定するための手法です。ここで処置（介入）とは、例えば治療や政策介入など影響を与える動きのことを言っています。</p>



<p class="wp-block-paragraph">因果推論では「何を知りたいのか？」を明確にするために<span class="jinr-d--text-color d--marker1 d--bold">エスティマンド</span>という概念が重要になります。この記事では、因果推論におけるエスティマンドの概念について説明し、代表的なエスティマンドの種類を紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">推定器と推定量</h3>



<p class="wp-block-paragraph">データから因果関係を推定する際には「<span class="jinr-d--text-color d--marker1 d--bold">推定器（Estimator）</span>」と「<span class="jinr-d--text-color d--marker1 d--bold">推定量（Estimate）</span>」があります。</p>



<ul class="wp-block-list jinr-list">
<li>推定器：因果効果やパラメータを推定するために使用される統計的手法やアルゴリズムのこと</li>



<li>推定量：特定のデータセットをもとに推定器を適用した結果の数値</li>
</ul>



<p class="wp-block-paragraph">推定器には、単純な平均などを計算するものから、ディープラーニングのように数億ものパラメータを使った言語モデルまで多岐にわたります。推定器を用いて具体的なデータセットに対して計算を行った結果が推定量になります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">エスティマンドとは</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">エスティマンド（Estimand）</span>は、理論的に求めたい因果効果を数学的に定義したものです。これは、どのような因果効果を測定しようとしているかを明確にするための概念です。実際にデータから算出される推定量（Estimate）とは異なり、エスティマンドは「もしバイアスのない完全なデータが利用できるならば求められる理想的な値」と考えることができます。</p>



<p class="wp-block-paragraph">例えば、薬の効果を知りたい場合、同じ人が治療を受けた場合と受けなかった場合の結果を比較したいと考えます。しかし、現実には同じ個体に対して両方の状況を同時に観測することはできないため、反事実（Counterfactual）を推定する必要があります。反事実は、因果推論の重要な概念である「因果のはしご」において扱われるものです。</p>



<p class="wp-block-paragraph">このような反事実も考慮しながら因果効果を定義することがエスティマンドの役割であり、そもそも何を推定しようとしているかを定義するためにあります。</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">「因果のはしご（Ladder of Causation）」とは、Judea Pearl によって提唱された因果関係を理解するための 3 段階の枠組みです。具体的には「①関連（Association）」「②介入（Intervention）」「③反事実（Counterfactual）」というレベルで因果推論の理解を深めます。「<a href="https://tech.nkhn37.net/ladder-of-causation-basics/" target="_blank" rel="noreferrer noopener">因果のはしごの概要</a>」を参考にしてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">代表的なエスティマンド</h3>



<p class="wp-block-paragraph">代表劇なエスティマンドに這いつくか種類があり研究の目的に応じて選択することになります。ここでは、代表的なものを紹介していきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">平均因果効果<br> (ATE : Average Treatment Effect)</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">平均因果効果（ATE: Average Treatment Effect）</span>は、母集団における平均的な因果効果を示します。数式で表現すると以下のようになります。</p>



<p class="wp-block-paragraph">\[<br>\begin{eqnarray}<br>ATE=E[Y(1) &#8211; Y(0)]<br>\end{eqnarray}<br>\]</p>



<p class="wp-block-paragraph">ここで各要素は以下のような意味を持ちます。</p>



<ul class="wp-block-list jinr-list">
<li>$Y(1)$：処置を受けた場合の出力</li>



<li>$Y(0)$：処置を受けなかった場合の出力</li>



<li>$E[\cdot]$：期待値</li>
</ul>



<p class="wp-block-paragraph">ATE は、処置を受けた場合と受けなかった場合の出力の差の期待値ということになるため、文章にしてみると「もし、全ての個体が処置（介入）を受けた場合と受けなかった場合を比較したらどうなるか」を測る指標となります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">処置群における平均因果効果<br> (ATT: Average Treatment Effect on the Treated)</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">処置群における平均因果効果（ATT: Average Treatment Effect on the Treated）</span>は、実際に処置（介入）を受けた集団における因果効果を示します。数式で表現すると以下のようになります。</p>



<p class="wp-block-paragraph">\[<br>\begin{eqnarray}<br>ATT=E[Y(1) &#8211; Y(0) | D=1]<br>\end{eqnarray}<br>\]</p>



<p class="wp-block-paragraph">ここで、$D=1$ は処置（介入）を受けた個体を意味します。これは「実際に<span class="jinr-d--text-color d--marker2">処置（介入）を受けた人</span>に対して、どの程度の影響を与えたか」を評価する指標となります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">対照群における平均因果効果<br> (ATU: Average Treatment Effect on the Untreated)</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">対照群における平均因果効果（ATU: Average Treatment Effect on the Untreated）</span>は、処置（介入）を受けなかった集団における因果効果を示します。数式で表現すると以下のようになります。</p>



<p class="wp-block-paragraph">\[<br>\begin{eqnarray}<br>ATU=E[Y(1) &#8211; Y(0) | D=0]<br>\end{eqnarray}<br>\]</p>



<p class="wp-block-paragraph">ここで、$D=0$ は処置（介入）を受けなかった個体を意味します。これは「もし<span class="jinr-d--text-color d--marker2">処置（介入）を受けなかった人</span>に対して、どの程度の影響があったか」を評価する指標となります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">条件付き平均因果効果<br> (CATE: Conditional ATE)</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">条件付き平均因果効果（CATE: Conditional ATE）</span>は、特定の条件を満たす個体群における因果効果を示します。数式で表現すると以下のようになります。</p>



<p class="wp-block-paragraph">\[<br>\begin{eqnarray}<br>CATE=E[Y(1) &#8211; Y(0) | X=x]<br>\end{eqnarray}<br>\]</p>



<p class="wp-block-paragraph">ここで、$X$ は特定の個体の特徴（例えば、年齢、性別、健康状態など）を表します。$X$ が特定の $x$ であるときの平均因果効果が CATE になります。</p>



<p class="wp-block-paragraph">CATE は「特定の条件のサブグループに対して処置（介入）をした効果がどの程度の影響があったのか」を評価する際に有用です。機械学習モデルを利用して個々の特性ごとの処置効果のばらつきを捉える「異質な処置効果（Heterogeneous Treatment Effect）」の分析において、特に重要な指標となります。</p>



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



<p class="wp-block-paragraph">因果推論において重要な概念である<span class="jinr-d--text-color d--marker1 d--bold">エスティマンド</span>の概念について解説しました。</p>



<p class="wp-block-paragraph">エスティマンドは、因果推論において「何を知りたいのか」を明確にするための重要な概念であり、代表的なエスティマンドとして ATE、ATT、ATU、CATE があります。</p>



<ul class="wp-block-list jinr-list">
<li><strong>ATE</strong> : 母集団全体における平均因果効果</li>



<li><strong>ATT</strong> : 処置（介入）を受けた人における因果効果</li>



<li><strong>ATU</strong> : 処置（介入）を受けなかった人における因果効果</li>



<li><strong>CATE</strong> : 特定の条件を満たす人における因果効果</li>
</ul>



<p class="wp-block-paragraph">実際のデータ分析では、これらのエスティマンドを適切に定義し、推定する手法を選択することが求められます。エスティマンドの考え方をしっかり理解してもらえたらと思います。</p>


<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/causal-estimand-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【因果推論】d分離（d-separation）の概念</title>
		<link>https://tech.nkhn37.net/causal-inference-d-separation/</link>
					<comments>https://tech.nkhn37.net/causal-inference-d-separation/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 14 Feb 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[因果推論]]></category>
		<category><![CDATA[d-separation]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=12231</guid>

					<description><![CDATA[確率的グラフィカルモデルの重要な概念である d 分離（d-separation）について解説します。d 分離は、グラフ構造に関する概念ですが因果推論でも重要な概念です。 d 分離（d-separation）とは？ d 分 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">確率的グラフィカルモデルの重要な概念である <span class="jinr-d--text-color d--marker1 d--bold">d 分離（d-separation）</span>について解説します。d 分離は、グラフ構造に関する概念ですが因果推論でも重要な概念です。</p>



<h2 class="wp-block-heading jinr-heading d--bold">d 分離（d-separation）とは？</h2>



<h3 class="wp-block-heading jinr-heading d--bold">d 分離の概要</h3>



<p class="wp-block-paragraph">因果推論では、変数間の関係を因果ダイアグラム（Causal Diagram）、特に有効非巡回グラフ（DAG: Directed Acyclic Graph）を用いて表現することが一般的です。因果ダイアグラムについては「<a href="https://tech.nkhn37.net/causal-diagrams-with-python/" target="_blank" rel="noreferrer noopener">因果ダイアグラムの概要</a>」を参考にしてください。</p>



<p class="wp-block-paragraph">グラフにおける <span class="jinr-d--text-color d--marker1 d--bold">d 分離（d-separation）</span>とは、2 つのノード（変数）の集合 X と Y の間の統計的依存関係が遮断されることを意味します。つまり、d 分離が成り立つとき、適切な確率分布のもとで X と Y は独立となります。ただし、全ての確率分布で成り立つわけではなく、特にベイジアンネットワークの仮定（DAG に沿った因果構造をもつ確率分布）では、d 分離であれば統計的独立が保証されます。</p>



<p class="wp-block-paragraph">なお、d 分離は因果推論に特化した概念ではなく、グラフィカルモデル全般において使用される統計的独立性の判断基準です。例えば、ベイジアンネットワークや機械学習における確率的モデリングの分野でも重要な役割を果たします。</p>



<p class="wp-block-paragraph">因果推論の分野では、d 分離を用いることで観測データに基づく推論の際に、どの変数をコントロールするべきか判断するのに役立ちます。この記事では、<span class="jinr-d--text-color d--marker1 d--bold">d 分離の概要</span>について紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">d 分離の定式化</h3>



<p class="wp-block-paragraph">d 分離の説明していくにあたってまずは一般的な考え方として表現します。</p>



<p class="wp-block-paragraph">ノードの集合として X、Y、Z があるとします。より簡単にはノード 1 つで考えることですが、集合を 1 つと考える場合と思っていただければと思います。このとき、X と Y を結ぶすべてのパスが Z によってブロックされるとき X と Y は Z によって d 分離されていると言います。</p>



<p class="wp-block-paragraph">例えば、例として以下のようなグラフが考えられます。上の図は複数ノードから成り立っており、集合 X、Y、Z に分類することができます。下の図は各集合が 1 つのノードで成り立っている場合の例です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="858" src="https://tech.nkhn37.net/wp-content/uploads/2025/02/image-19-1024x858.png" alt="d分離のイメージ図" class="wp-image-12256" style="width:586px;height:auto" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/02/image-19-1024x858.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2025/02/image-19-300x251.png 300w, https://tech.nkhn37.net/wp-content/uploads/2025/02/image-19-768x644.png 768w, https://tech.nkhn37.net/wp-content/uploads/2025/02/image-19.png 1055w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">これらのグラフが与えられたときにパスがブロックされて d 分離されるかの判断基準について以降で説明していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">チェーン、フォーク、コライダーとの関連性</h3>



<p class="wp-block-paragraph">因果推論の因果ダイアグラムにおいて重要な構造としてチェーン、フォーク、コライダーという構造があります。これらの構造については「<a href="https://tech.nkhn37.net/causal-diagrams-chain-fork-collider/" target="_blank" rel="noreferrer noopener">チェーン、フォーク、コライダーの構造と特徴</a>」を参考にしてください。</p>



<p class="wp-block-paragraph">これらの構造と d 分離の関係は以下のように整理できます。X と Y の関係性において Z に条件付けるかどうかで d 分離（パスがブロック）されるかが判断できます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>構造</th><th>構造</th><th>関係性</th></tr></thead><tbody><tr><td>チェーン構造</td><td>X → Z → Y</td><td><strong>[Z に条件付けない場合]</strong><br>X から Y へのパスは開いており、X と Y は Z を介して関連を持つ可能性があります。Z は媒介因子と呼ばれます。<br><br><strong>[Z に条件付ける場合]</strong><br>X と Y のパスは閉じ、X と Y は条件付き独立（d 分離）となります。</td></tr><tr><td>フォーク構造</td><td>X ← Z → Y</td><td><strong>[Z に条件付けない場合]</strong><br>X と Y は Z を介して関連を持つ可能性があります。Z は交絡因子と呼ばれ、Z によって X とY の間に相関が生じることがあります。<br><br><strong>[Z に条件付ける場合]</strong><br>X と Y の間の依存関係が取り除かれて、条件付き独立（d 分離）となります。</td></tr><tr><td>コライダー構造</td><td>X → Z ← Y</td><td><strong>[Z に条件付けない場合]</strong><br>X と Y は統計的に独立（d 分離）しています。<br><br><strong>[Z に条件付ける場合]</strong><br>Z に条件付けると、X と Y の間に見せかけの相関が生じます。これを<strong>コライダー・バイアス</strong>と言います。</td></tr></tbody></table></figure>



<h3 class="wp-block-heading jinr-heading d--bold">【補足】「条件付ける」と「コントロールする」の違い</h3>



<p class="wp-block-paragraph">因果推論の勉強をしていると「条件付ける」という言葉や「コントロールする」という言葉が出てきます。これらについては、使われ方によってほぼ同じ意味で使われることがありますが、厳密にはニュアンスが少し異なります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">条件付ける（Conditioning）</h5>



<p class="wp-block-paragraph">「条件付ける」という言葉は、統計的な意味合いが強い場合で使用されます。確率分布の条件を設定することを指していて条件付確率 P(X, Y | Z) のように表されます。</p>



<p class="wp-block-paragraph">あるノード（変数）の情報を得ることにより確率分布が変わるイメージです。例えば、ある病気の診断 Z を知ったうえで、遺伝子 X と生活習慣 Y の関係を考えるような場合、Z に条件付けると言います。</p>



<h5 class="wp-block-heading jinr-heading d--bold">コントロール（Controlling）</h5>



<p class="wp-block-paragraph">「コントロールする」という言葉は、因果推論の文脈で使われることが多いです。「ある変数の影響を取り除く」ことを意図します。</p>



<p class="wp-block-paragraph">実際のデータ分析では、回帰モデルの説明変数として対象変数を入れることをコントロールすると表現します。例えば、年収 Z をコントロール（年収帯を固定するなど）することで、教育水準 X と健康状態 Y の関係性を見極めるような場合です。</p>



<h5 class="wp-block-heading jinr-heading d--bold">どのように使うべきか</h5>



<p class="wp-block-paragraph">まとめてみると「条件付ける」と「コントロールする」という表現は以下のように使い分けることが適切です。</p>



<ul class="wp-block-list jinr-list">
<li>d 分離の文脈：「条件付ける」という表現が適切</li>



<li>因果推論の文脈：「コントロールする」という表現が適切</li>
</ul>



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



<p class="wp-block-paragraph">確率的グラフィカルモデルの重要な概念である <span class="jinr-d--text-color d--marker1 d--bold">d 分離（d-separation）</span>について解説しました。d 分離は因果推論に特化した概念ではなく、グラフィカルモデル全般において使用される統計的独立性の判断基準ですが、この記事では因果推論に絡めつつ説明をしました。</p>



<p class="wp-block-paragraph">d 分離を判断するためには、チェーン、フォーク、コライダーといったグラフにおける重要な構造に紐づけて調べる必要があります。d 分離を用いることで観測データに基づく推論の際に、どの変数をコントロールするべきか判断するのに役立ちます。d 分離についてぜひ学んで理解を深めてみてください。</p>


<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/causal-inference-d-separation/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-07 00:04:27 by W3 Total Cache
-->