SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.15の新機能――明示的な遅延インポートとイミュータブルな辞書型などを解説

Pythonの新機能を知ろう! 第8回

WINGSプロジェクト 山内 直[著] / 山田 祥寛[監修]

必要になったらインポート! Pythonプログラムの起動を高速化するlazy imports

 通常のimport文では、その場でモジュールを読み込み、モジュール直下に記述されたコードを実行します。そのため、大規模なプログラムでは、複数の依存モジュールが連鎖的に読み込まれ、起動時に時間がかかることがあります。

 たとえば、CLIプログラムでヘルプを表示するだけの場合でも、実際には使用しない機能のモジュールまで読み込まれてしまうことがあります。

 こうした問題を避けるため、従来は関数内にimport文を移すなどの方法が使われてきました。しかし、この方法ではimport文がコードのあちこちに分散し、依存関係を把握しにくくなることがあります。

 そこでPython 3.15では、lazyソフトキーワードを使って、遅延させたいインポートを明示できるようになりました。通常のimport文の動作は変わらないため、必要な箇所から段階的に導入できます。遅延インポートでは、実際にその名前を初めて利用するまでモジュールの読み込みと初期化処理が遅れるため、起動時に不要な処理を省けます。

 lazy importsの基本的な動作を、以下のリストで見てみましょう。

リスト lazy_imports.py
import sys

print("lazy import前:", "fractions" in sys.modules)

lazy import fractions

print("lazy import直後:", "fractions" in sys.modules)

value = fractions.Fraction(1, 3)
print("初回利用後:", "fractions" in sys.modules)
print(value)

 実行すると、以下のようになります。

lazy import前: False
lazy import直後: False
初回利用後: True
1/3

 この結果から、lazy import fractionsと記述した直後には、fractionsモジュールがまだsys.modulesに登録されておらず、fractions.Fractionを初めて利用した時点で登録されることが分かります。

 lazy importsの効果が出やすいのは、サブコマンドごとに利用する機能が異なるCLIプログラムや、オプション機能を多く備えたアプリケーション、依存モジュールの多いプログラムなどです。

 一方、遅延インポートはモジュールの読み込みや初期化そのものをなくす仕組みではありません。そのモジュールを必ず利用する場合は、読み込みのコストが初回利用時に移るだけです。また、インポート時の副作用やエラーも初回利用時まで遅れるため、モジュールのインポート時に登録処理や初期化処理を行うコードでは注意が必要です。

 このように、lazy importsは、プログラムの構成やモジュールの利用状況によっては、起動時間の短縮に役立つ機能です。

Pythonにもイミュータブルの波!変更できない辞書型でオブジェクトを安全に取り回す

 Python 3.15では、作成後に内容を変更できない辞書型frozendictが組み込み型として追加されました。通常の辞書型dictは、項目の追加や削除、値の変更が可能です。

 一方、frozendictでは、作成後に項目を変更できません。そのため、設定値を安全に共有したり、変更されない辞書を定数のように扱ったりする用途に適しています。

 以下のリストは、frozendictの基本的な使い方を示したものです。

リスト frozendict.py
options = frozendict({"theme": "dark", "retries": 3})

print(options["theme"])			# dark
print(hash(options))			# -5124222020327150035

options["retries"] = 5			# TypeError

 frozendictは、dictと同様に、キーと値の組を指定して初期化したり、キーを指定して値を取り出したりできます。一方、作成後の項目の追加や値の変更はできません。上のリストでは「options["retries"] = 5」によって値を変更しようとすると、TypeErrorが発生します。

 また、すべてのキーと値がハッシュ可能であれば、hash関数でハッシュ値を取得できます。これにより、通常のdictではできない、辞書を別の辞書のキーとして利用することも可能になります。

 たとえば、次のリストでは、frozendictをキーにして対応する結果を格納しています。

リスト frozendict_key.py
options = frozendict({"theme": "dark", "retries": 3})

cache = {
    options: "設定に対応する結果",
}

print(cache[options])	# 設定に対応する結果

 ただし、注意したいのは、frozendictが保証するのは、辞書の項目を変更できないという意味での不変性であることです。値にリストなどの変更可能なオブジェクトが含まれている場合、その中身までは保護されません。

 たとえば、値にリストを格納した場合、そのリストの要素は変更できます。また、リストのようにハッシュ化できない値が含まれている場合、frozendict自体もハッシュ化できません。

 こういった制約を理解したうえで利用すれば、設定値の共有や辞書をキーとするキャッシュなど、さまざまな場面で役立ちます。

次のページ
省略や無効を明確に示す! 番兵値を明確に表すsentinel型で曖昧さを排除

この記事は参考になりましたか?

Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー