CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。
現在学習中の5章「怪しいコード臭」では、バグを未然に防ぐために、どういった点に注意した方が良いのか、対処するか否かの判断について学んでいます。
今回はデバッガーとloggingモジュールについてです。
バグを発見する方法のひとつにprint文を使った手法があります。この手法はprint文をプログラムの途中に入れて、出力されたものが想定していた結果になるかどうかを確認していくというもので、場合によっては何度も繰り返していくことになります。こちらは比較的、初心者の方にとって使いやすい方法ということだそうです。
この節でprint文によるデバッグがまず取り上げられているのですが、これは[print()]を消し忘れ、コード臭になる可能性が出てくるためのようです。そのため、print文によるデバッグではなく、デバッガーやログファイルを使った方が消し忘れのミスが減るし、なんだかんだ言って速く済むよということでした。
ではまずはそのデバッガーについて。
---------------------------------------------------------------
P.80
プリントデバッグは、一見速くてシンプルですが、バグを修正するために必要な情報を表示するまでに、プログラムの再実行を何度も繰り返さなければならないことがよくあります。解決策としては、デバッガーを使うかプログラムにログファイルを設定することです。デバッガーを使うと、プログラムを1行ずつ実行し、任意の変数を検査することができます。
---------------------------------------------------------------
まず、デバッグとは、プログラム中に含まれている不具合や欠陥(バグ)を発見・解析・修正するため行為になります。そうした行為を行う人や、支援するツール・機能のことを「デバッガー」といいます。
例えば、Visual Studio Code(VS Code)などの統合開発環境(IDE)にはデバッガーの機能やツールが搭載されています。
私自身はVS Codeも使っていますが、正直この機能を使いこなせていません。良い機会なのでVS Codeでのデバッガーの使い方を調べてみたところ、手順をおって書いてくださっているページを見つけました。興味がある方はご覧ください。
Pythonでprintデバッグから卒業する【VSCode・CursorでPythonのデバッグ】
ちなみに、デバッガーを使う場合、ブレークポイントを設定する必要が出てくるのですが、もしデバッガーを使わずに行いたい場合には、breakpoint関数を使う方法もあるとのこと。その手法については以下のページに簡単に紹介されていたので、興味がある方はぜひこちらもどうぞ。
作ったPythonプログラムが動かない...効率的なデバッグ方法を学んで品質を高めよう
こちらの記事にはここで出てきたprintデバッグの方法や、次の項目で学ぶloggerを使った方法以外に、type関数、dir関数を使った方法なども説明されています。
では次にログファイルについてです。
---------------------------------------------------------------
P.80
ログファイルは、プログラムからの大量の情報を記録することができるので、あるプログラムの実行を以前の実行と比較することができます。Pythonでは組み込みのloggingモジュールを使うと、たった3行のコードで簡単にログファイルを作成することができます。
import logging
logging.basicConfig(filename='log_filename.txt', level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
loggingモジュールをインポートして基本的な設定を行った後、画面に表示するprint()ではなくlogging.debug()を呼び出して、テキストファイルに情報を書き込みます。
---------------------------------------------------------------
サンプルコードを確認してみます。
logging.basicConfig(filename='log_filename.txt', level=logging.DEBUG,
logging.basicConfig:ログの出力方法を一括で設定するための関数
filename :ログの出力先ファイル名(これを指定しない場合はコンソール画面に表示される)
level :出力されるログの最小レベル(深刻度)
レベルはログの深刻度を指すもので、5段階あります。
レベル | 利用するタイミング |
DEBUG | おもに問題を診断するときにのみ関心があるような、詳細な情報。 |
INFO | 想定された通りのことが起こったことの確認。 |
WARNING | 想定外のことが起こった、または問題が近く起こりそうである (例えば、'disk space low') ことの表示。 |
ERROR | より重大な問題により、ソフトウェアがある機能を実行できないこと。 |
CRITICAL | プログラム自体が実行を続けられないことを表す、重大なエラー。 |
このサンプルコードでは、DEBUGを最小レベルにしているので、5段階すべてのログが表示されることになります。もしWARNINGを設定していたら、WARNING以上の3段階分(WARNING、ERROR、CRITICAL)だけが表示されるということですね。
次に結果としてログに出力される内容の部分について見てみます。
format='%(asctime)s - %(levelname)s - %(message)s')
この部分は表示結果に影響する部分で、それぞれ以下の意味があるとのこと。
%(asctime)s :時刻
%(levelname)s :深刻度
%(message)s') :メッセージの内容(logging.debug('メッセージ')で設定した()内の文章)
結果、引用文中のサンプルコードを実行すると、以下のように表示されるとのこと。
2025-04-16 16:05:23,456 - DEBUG - This is a log message.
loggingモジュールの使い方について参考になりそうなサイトを併せてご紹介します。
Logging HOWTO|Pythonチュートリアル
Pythonでprintを卒業してログ出力をいい感じにする
Pythonにおけるlogging徹底攻略
こちらはテキストで紹介されていたページです。
Automate the Boring Stuff with Python, 2nd Edition: Practical Programming for Total Beginners 2nd Edition
それでは今回はこちらで終了です。今回もお付き合いいただきありがとうございました。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes