Pythonのassert文とは?
Pythonのassert文は、プログラムを実行している途中で、「この条件は必ず真(True)であるべきだ」という、コードを描いた開発者の意図(表明・断言:assertion)を示すために使われます。これは、そのプログラムに論理的な誤りがないかを素早く確認するためのデバッグツールです。
assert文は主にコードの開発やテスト段階で使用されます。例えば、関数に渡される引数が特定の型や値の範囲になっているか、計算結果が予想通りの値や構造になっているかなど、プログラムが正常に動作するための条件を確認し、質を高めるのに役立ちます。
assert文で条件が満たされずに偽(False)になった場合は、「AssertionError」という特別な例外を発生させ、直ちにプログラムの実行を停止します。これにより、問題が起きた場所でプログラムが止まるため、エラーが起きた場所をすぐに発見して修正することができます。例えば複雑なプログラムの開発中に、予期せぬ事態が起こっていないかを早期に、かつ確実に検出するための安全装置として機能します。
ただし、Pythonを-O(最適化)オプション付きで実行した場合、すべてのassert文は無効化されます。そのため、致命的なバリデーション処理にはtry-except文などの通常の例外処理を併用することが推奨されます。
【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング
基本構文
Pythonのassert文の基本構文は、非常にシンプルで分かりやすいのが特徴です。最も基本的な形式は以下のようになります:
ここで「条件式」とは、評価するとTrueかFalseのどちらか(真偽値)になる式のことで、「エラーメッセージ」の部分は省略可能な(オプションの)引数です。もしも条件式がFalseと評価された場合、AssertionErrorが発生し、ここで指定したエラーメッセージが表示されます。
例えば、変数xが正の数であることを確認したい場合は:
x = 10
assert x > 0, "xは正の数でなければなりません" # assert文により、指定した条件式がTrueであるか検証する。Trueであればそのまま実行され、FalseはAssertionErrorというエラーが発生し、””の中が表示される
また、関数の戻り値を検証する場合は:
def get_animal_age(animal): # get_animal_age()メソッドによる年齢の取得
# 何らかの処理
return 5
age = get_animal_age("イヌ")
assert age > 0, "年齢は正の数である必要があります"
assert文は中に書く条件式が複雑になっても問題なく使用できるため、プログラムの様々な部分で意図した状態になっているかの検証ができます。エラーメッセージは必須ではありませんが、書いておくことで、エラー発生時に何が問題だったかを素早く理解し、原因を特定しやすくなります。
実用例
Pythonのassert文は、コードを書く様々な場面で活用できる、とても便利な機能です。ここでは、実際の開発でどのようにassert文が役立つのかを紹介します。これらの例を通して、assert文の実用的な使い方を学びましょう。
以下では、様々なシナリオでの具体的なコード例を解説します。では、それぞれの例で、assert文の実用的な使い方と、その状況に応じた活用方法を見ていきましょう。
シンプルな値の検証
最も基本的なassert文の使い方は、値や変数が期待通りであることを確認することです。例えば、動物の体重が正の値であることを確認する、といった例を見てみましょう。
animal_weight = 15.5 # キログラム
assert animal_weight > 0, "動物の体重は正の値である必要があります" # assert文による条件式の判定。animal_weightが0以下の場合はAssertionErrorが発生し、””のエラーメッセージが表示されてプログラムが停止する
print(f"イヌの体重: {animal_weight}kg")
出力結果:
イヌの体重: 15.5kg
関数の引数チェック
関数内で渡された引数の値や型が正しいのかを検証する場合にもassert文が便利です。以下に、動物の年齢を設定する関数での使用例を示します。
def set_animal_age(age): # set_animal_age()メソッド(動物の年齢設定)メソッドによる、値の条件判定
assert isinstance(age, int), "年齢は整数である必要があります" # isinstance()メソッドによる型判定。第一引数のオブジェクト(age)が、第二引数で指定された型(int, 整数型)のインスタンスであるかを判定する。
assert age >= 0, "年齢は負の値にはなりません"
return f"ネコの年齢は{age}歳に設定されました"
print(set_animal_age(3))
出力結果:
ネコの年齢は3歳に設定されました
データ型の確認
コードの中で特定のデータ型である必要がある場合、assertを使って型が正しいかを確認できます。これにより、間違った型が使われるようなバグを早期に発見できます。
animal_list = ["イヌ", "ネコ", "ウサギ"]
assert isinstance(animal_list, list), "動物データはリスト形式である必要があります" # isinstance()メソッドによるリスト型の型判定
assert all(isinstance(animal, str) for animal in animal_list), "すべての動物は文字列である必要があります"
# (isinstance(animal, str) for animal in animal_list)でリストの一つ一つの要素を判定。animal_listの各要素をanimalに一つずつ取り出し、isinstance()メソッドにより、各要素が文字列であるか判定し、結果を順番に生成。今回の場合はTrue, True, Trueと生成される
# すべての要素が文字列であるかの確認。all()メソッドはすべての要素がTrueである場合にTrueを返す
print(f"動物リスト: {', '.join(animal_list)}")
出力結果:
動物リスト: イヌ, ネコ, ウサギ
リストの要素チェック
プログラムで扱っているリストの内容や長さが期待通りであるかを検証する場合にもassert文が役立ちます。以下の例では、動物リストが空でないことを確認しています。
zoo_animals = ["ライオン", "キリン", "ゾウ"]
assert len(zoo_animals) > 0, "動物園には少なくとも1種類の動物が必要です" # len()関数により、リストの要素数を取得して判定
assert "ライオン" in zoo_animals, "ライオンは動物園の主要な動物です" # in演算子により、inの左辺の要素が右辺のシーケンス(リストやタプル、文字列など)に含まれるかの判定
print(f"動物園の動物: {', '.join(zoo_animals)}")
出力結果:
動物園の動物: ライオン, キリン, ゾウ
オブジェクトの属性検証
オブジェクト指向プログラミングにおいて、assert文を使用すると、オブジェクトが期待する属性(データ)や機能(メソッド)を持っていることが確認できます。
class Animal: # Animal(動物)クラスの作成
def __init__(self, name, species):
self.name = name
self.species = species
pet = Animal("ポチ", "イヌ") # Animalクラスの新しいインスタンスの作成
assert hasattr(pet, "name"), "Animalオブジェクトにはname属性が必要です" # hasattr()メソッドにより、第一引数(pet)が、第二引数(“name”)の属性を持っているかの判定
assert pet.species in ["イヌ", "ネコ"], "このプログラムはイヌとネコのみをサポートします" # in演算子による、speciesの値がリスト内に含まれているかの判定
print(f"ペットの名前: {pet.name}, 種類: {pet.species}")
出力結果:
ペットの名前: ポチ, 種類: イヌ
数値範囲の検証
プログラムで扱う数値が、期待している特定の範囲内にあるかを確認したい場合にもassert文を使用できます。以下で温度計の測定値を確認する例を見てみましょう。
animal_body_temp = 38.5 # 摂氏度(体温)
assert 35.0 <= animal_body_temp <= 43.0, "動物の体温が通常範囲外です"
# 比較演算子の連結。assert 35.0 <= animal_body_tempとanimal_body_temp <= 43.0両方がTrueの場合のみTrueを返す
print(f"イヌの体温: {animal_body_temp}°C")
出力結果:
イヌの体温: 38.5°C
文字列フォーマットの確認
プログラムで扱っている文字列が、特定のパターンやフォーマット(例*メールアドレスや電話番号)に従っていることを確認するために、assert文と正規表現(文字列のパターンを表現するための特別な記法)を組み合わせて使うことができます。
import re
animal_id = "CAT-2023-0001"
pattern = r"^(DOG|CAT)-\d{4}-\d{4}$" # 「文字列の先頭が『DOG』または『CAT』で始まり、ハイフン、数字4桁、ハイフン、数字4桁が続き、そのまま文字列が終了する」というフォーマットの設定
assert re.match(pattern, animal_id), "動物IDは正しいフォーマットである必要があります" # re.match()による、animal_idの文字列がpatternの正規表現と合致するかの判定
print(f"ネコのID: {animal_id}")
出力結果:
ネコのID: CAT-2023-0001
辞書のキー存在確認
プログラムで扱う辞書データにおいて、特定のキーが存在しているかを確認するためにassert文を使用できます。以下は、動物の情報を含む辞書の例を示します。
animal_data = {"name": "ドナルド", "species": "アヒル", "age": 3}
required_keys = ["name", "species"]
for key in required_keys: # for文により、required_keysのリストの中身を一つずつ取り出し、keyに格納
assert key in animal_data, f"動物データには{key}キーが必要です" # in演算子による、keyがanimal_dataのキーとして存在するかの判定
print(f"動物情報: {animal_data['name']}は{animal_data['age']}歳の{animal_data['species']}です")
出力結果:
動物情報: ドナルドは3歳のアヒルです
まとめ
Pythonのassert文は、Pythonにおける強力なデバッグツールです。シンプルな使い方で、値や状態の妥当性を効率よく検証できます。
特に開発初期やテスト時において、プログラムの信頼性向上に貢献します。ただし、本番環境では無効化される可能性があるため、致命的なバリデーションにはtry-except構文との併用が必要です。
正しく使いこなせば、堅牢で読みやすいコードを書くための心強い味方になるでしょう。
レベルを更に上げたい方はpaizaプログラミングスキルチェックへ