前回コンテンツは下記リンクよりご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その4
Pythonの組み込みのunittest
モジュールはPyUnitとしても知られており、コードのテストケースを作成し実行するための堅牢で柔軟なツールです。これは他のいくつかの言語で普及しているxUnitアーキテクチャに触発されています。テストはソフトウェア開発において不可欠な要素であり、コードが期待通りに動作することを保証します。unittest
を使えばほぼすべてのPythonの関数やメソッドに対してテストを書くことができます。
unittest
モジュールにはいくつかの便利な機能があります。テストケースはunittest.TestCase
をサブクラス化し、そのサブクラスでメソッドを定義することで作成されます。各メソッドは1つのテストを表し、TestCaseが提供する様々なassert
メソッドを使用します。2つの値が同じかどうかをチェックするassertEqual
のように満たすべき条件をチェックしなければなりません。setup
とteardown
メソッドにより、テストが実行される固定された環境を持つことができます。
個々のテストを書くためのフレームワークを提供するだけでなくunittest
にはテストを実行してレポートを提供できるテストランナーも含まれています。unittest.main()
を呼び出すことで、テストランナーは現在のモジュールにあるすべてのテストメソッドを見つけ実行できます。Pythonのunittest
ライブラリを使えば、開発者は自分のコードの安定性と信頼性に自信を持つことができます。
このスクリプトではtest_add
とtest_add_negative
という2つのテストケースが定義されています。unittest.main()
関数はスクリプトからすべてのテストケースを収集し実行します。
Pythonのtrace
モジュールはPython文の実行を追跡できる非常に便利なツールです。特に複雑なアプリケーションでは、デバッグやコードの流れを理解するためによく使われます。このモジュールはトレース結果を生成するメカニズムを提供し、コードが特定のポイントに入ったとき、または出たときを記録します。これはプロジェクトにオンボードしたての新人にとって特に有用であり、アプリケーションの異なるコンポーネントがどのように相互作用するかについての洞察を提供できます。
trace
モジュールはスクリプト内のすべてのステートメントの実行を記録するために使用されます。以下はtrace
モジュールの使い方の簡単な例です。
この例ではcount=True
とtrace=True
の2つの引数でtrace.Trace
を呼び出しています。count
引数は各関数の呼び出し回数のカウントを可能にし、trace
引数はトレース機能をオンにします。run
関数はトレースコンテキスト内で提供されたコードを実行するために使用され、その結果はresults
関数を通じて利用可能です。
trace
モジュールは基本的な機能に加えて、より高度な機能をいくつかサポートしています。例えば、トレースされた関数のフィルタリング、関数呼び出し回数のレポート作成、トレース結果の保存による後々の解析などです。trace.Trace
にignoredirs
パラメータを指定すると、特定のディレクトリにある関数のトレースを無視できます。このようなレベルの制御によりtrace
はPythonのコード実行に関する洞察を得るための強力なツールになります。
trace
は強力なツールですが、他のロギングと同様にトレースによるパフォーマンスへの影響に注意することが重要です(特に本番環境)。また、特に大規模で複雑なスクリプトの場合、トレース出力を生成するデータ量が多いため、トレース出力を理解するのに圧倒されることがあることを心に留めておいてください。trace
はコード実行の一部としてではなく、学習やデバッグのツールとして使用するのがベストです。
Pythonプログラミングの領域では、異なるプロジェクトで作業することはしばしば異なる依存関係を必要とすることを意味します。venv
は他のプロジェクトやグローバルなPythonのインストールに干渉することなく、特定のバージョンのPythonパッケージをインストールできる隔離された仮想環境を作成するために使用されます。各仮想環境は基本的に自己完結型のPythonインストールとして動作し、パッケージ間の競合を回避できるためプロジェクトの一貫性を維持するのに役立ちます。
venv
を使用する最初のステップは新しい仮想環境を作成することです。これはvenv
コマンドの後に環境を作成するディレクトリの名前を付けて実行します。
このコマンドはmyenv
ディレクトリが存在しない場合、新しいディレクトリを作成し、その中に必要なスクリプトとディレクトリをセットアップします。m
オプションはPythonにvenv
モジュールをスクリプトとして実行するように指示します。
仮想環境を作成したら、それを使用する前にactivate
(有効化)する必要があります。仮想環境を有効にするとPATHが変更され、python
コマンドが正しいバージョンで実行されるようになり、PythonセッションがグローバルなPythonのインストールから分離されます。仮想環境を有効にするには次のコマンドを使用します。
仮想環境が起動するとこの隔離された空間内でPythonパッケージをインストールされ使用できます。例えばpip
を使ってこの環境にのみパッケージをインストールできます。
終了したら仮想環境をdeactivate
(解除)することを忘れないでください。これによりターミナルセッションはグローバルなPythonコンテキストに戻されます。
sys
モジュールは、Pythonインタープリタが使用または維持するいくつかの変数やインタープリタと対話する関数へのアクセスを提供します。
sys
モジュールの最も一般的な用途の1つは、Pythonスクリプト内のコマンドライン引数にアクセスすることです。コマンドラインからPythonスクリプトを実行する際、スクリプトへ直接追加の引数を渡すことができます。これらの引数はPythonのリストであるsys.argv
に格納されます。
このスクリプトではsys.argv[0]
がスクリプト自体の名前、sys.argv[1]
以降がスクリプトに渡した引数です。
sysモジュールのもう1つの便利な機能としてexit
関数があります。この関数を使うとPythonスクリプトが自然に終了する前に終了させることができます。例えば、ある条件が満たされなかった場合にスクリプトを終了させたい場合があります。
この例では、条件がFalse
と評価された場合、スクリプトは終了し指定されたメッセージが表示されます。
sys
モジュールは、標準入力、出力、エラーストリーム、システム固有の設定情報、およびその他の有用なリソースへのアクセスも提供します。システムレベルのプログラミングを行うためのPythonのツールキットとして不可欠なものであり、このモジュールに慣れることはPythonをマスターするための良いステップとなります。
Pythonのwarnings
モジュールは、必ずしもプログラムを停止させるわけではないが、重要な意味を持つ可能性がある変更についてプログラムの利用者に警告するための便利なツールです。例えば、非推奨の機能についての警告、軽微な不具合についての通知、プログラムの機能に影響を与える可能性のある将来予測可能な問題についての警告などです。
警告の一般的な使用例としてある機能や特徴が非推奨になる場合があります。例えば、ライブラリを開発しているときにある関数の名前を変更することにしたとします。しかし、古い関数名を使用している既存のコードをすべて壊したくはないことがあります。そのようなときにwarnings
モジュールを使ってユーザーに変更を警告できます。
この例では、old_function
が呼び出されるたびにこの関数は非推奨であり、代わりにnew_function
を使うべきであるという警告をユーザーに発します。
warnings.filterwarnings()
関数で警告が発行されたときの動作を制御可能です。デフォルトではwarnings
はsys.stderr
に出力されますがこの動作を変更できます。例えば、すべての警告をエラーに変えるには次のようにします。
この場合、警告メッセージを表示するだけでなく警告が発行されるたびにPythonは停止して例外を発生させます。
warnings
モジュールの使い方を知っておくことは他の人が使うようなソフトウェアを書く人にとって非常に重要です。プログラムを完全に停止させることなく、ソフトウェアの使用に影響する可能性のある問題についてユーザーとコミュニケーションを取ることができる方法です。このようなコミュニケーションは変更が絶えないソフトウェア開発の世界では不可欠であり、ユーザーに変更点を知らせておくことは将来的に多くのトラブルを回避できます。
Pythonのtraceback
モジュールは開発者のための強力なツールです。Pythonプログラムのスタックトレースを抽出し、フォーマットし、出力する方法を提供します。基本的に、スタックトレースはプログラムがどのような流れである時点に至ったかを示す関数呼び出しのリストです。エラーに至った実行経路を示すため、エラーの理解や診断に役立ちます。
基本的な例として、意図的にゼロ除算のエラーを発生させる場合を考えてみましょう。traceback
はエラーに至った実行経路を示すものです。
このスクリプトを実行すると、PythonはZeroDivisionError
を投げ、コンソールにトレースバックを表示します。エラーを処理して独自のトレースバックを表示したい場合はtraceback
モジュールの出番です。
このスクリプトではdivide()
関数内で例外をキャッチし、エラーメッセージを表示した後、traceback.print_exc()
を呼び出してトレースバックを表示しています。
traceback
はPythonのデバッグに欠かせない要素です。エラーに至った経路を確認でき、それを抽出しフォーマットするための関数を提供します。例外をキャッチしてtraceback.print_exc()
を使用したように、トレースバックの表示方法を制御する機能はデバッグをより簡単に、より効率的にするための強力なツールになります。
Pythonのimportlib
モジュールは、プログラム内でモジュールをインポートするプロセスを制御するために使用できる、強力柔軟なツールです。Pythonのimport
文はその最も特徴的な機能の1つであり、モジュラープログラミングやコードの再利用を可能にします。しかし、より複雑なシナリオで動的にモジュールをインポートしたい場合、importlib
はその柔軟なインポート機能で役立ちます。
ここではimportlib
を使ってmath
モジュールを動的にインポートし、それを使っていくつかの計算をするという簡単な例を考えてみましょう。
この例ではimportlib.import_module('math')
はimport math
と同等です。しかし、importlib
を使う利点は標準のimport
文では不可能なインポートするモジュールを実行時に決めることができることです。
importlib
のもう1つの便利な機能はモジュールを再読み込みする機能です。モジュールがインポートされるとPythonはそのモジュールをキャッシュし、以降のインポート呼び出しには同じコピーを再利用します。つまり、モジュールがインポートされた後に変更されてもプログラムが再起動されるか、モジュールが明示的に再ロードされない限りPythonはその変更を見ることができません。
このスクリプトではmy_module
をインポートした後にいくつかの変更を加えています。更新されたバージョンのモジュールを同じプログラム内で使用するために、importlib.reload(my_module)
を呼び出して再読み込みしています。
importlib
モジュールは、プログラムをより柔軟でダイナミックなものへとするためにこれらの機能やその他の高度なインポート機能を提供します。