【開発効率UP】Pythonのassert文をわかりやすく解説。if文との比較と使用上の注意点

Pythonの開発効率を上げるassert文の使い方をif文と比べながら解説。注意点はassert文の有効・無効で、プログラムの機能が増減しないようにすること。

今回はPythonのちょっとしたお役立ちテクニック?として、assert文というものをご紹介・解説します。

assert文は、何かプログラムでエラーが出たときに、そのエラーの内容・場所を探りやすくするための情報を提供ものです。それによりプログラミングがより効率的に進みます。

言い換えると、プログラムの処理の流れを作ったり処理の内容や順番のような「ロジック」に直接関係するようなものではなく、あくまでエラー情報を知らせるためだけの機能を実現する文と言えます。

英語assertの意味

assertは英語で、その意味は「強く主張する」という意味です。

上述のように、Pythonのassert文は、エラーの情報をしっかりと明示してくれるという感じになります。

Pythonのassert文の基本的な使い方

基本的な使用法と機能

assert文は、Pythonの単純文 (simple statement)の1つです。そしてその使い方ですが、まず公式ドキュメントによると以下のように説明されています。

assert_stmt ::=  "assert" expression ["," expression]

ここで使われている単語の意味は、それぞれ

stmt(statementの略)
expression

となります。

そしてこの公式ドキュメントで書かれている内容の解説については次の画像を見てください。

Pythonのassert文の解説

この画像の説明が完全というわけではないのですが、公式ドキュメントで今回の説明と同じような単語や記号を使って説明されている場合は、上画像の内容を思い出して見てください。そうすると理解しやすくなると思います。

では次に具体例を見てみましょう。

具体例とその解説

以下の単純なコードを見てください。

a=1

assert a==2  # ①(a==2は代入ではない。評価された結果True or Falseという値が返る)

これを解説しますと次の通りです。

まず最初にaに1が代入されているため、aは1となります。したがって、assert直後の式「a==2」は間違いなので、Falseという値が返ってきます。

そしてassert文は、式がFalseならばエラーメッセージを発生させるので、今回はエラーメッセージ「AssertionError:」が表示されます。

また次のようなコードも可能です

assert a==2, 'aは1ですよ' f' 1+2は{1+2}'

オプションの部分に、エラーメッセージの内容として、

  • 「aは1ですよ」という文字列
  • 「f’ 1+2は{1+2}’」というフォーマット済み文字リテラル

を設定しました。

フォーマット済み文字リテラルは実行されると式として評価されるので、式として使えるのです。

if文を使って同じ機能を実現

assert文の機能は、if文と組み込み定数の1つ__debug__とを組みあわせて使って実現できます。次のコードがそれです。

if __debug__:
    if not a==2:
  # aが2じゃなければ、raise文が実行される
        raise AssertionError
    else:
  # aが2のとき実行される
        print('OK')

組み込み定数の1つ__debug__は、Pythonをコマンドライン環境で実行させるときにそのオプションで「-0」を設定したときにだけFalseが返され、それ以外はTrueが返ってきます。

AtomやVisual Studio Codeといったエディタ上で動かすだけの場合は、普通は__debug__はTrueのままでしょう。そしてif文は条件式がTrueならば実行されるので、上コードの一番最初のif文が実行されます。

結果、その内部のif else文も実行されます。

そしてaは1なので、「not a==2」(aは2ではない)という式は正しいです。したがってTrueと評価されます。そのためその下のraise文が実行されます。下表の通りです。

if __debug__:
パターン①
コマンドラインオプションに「-0」を設定しない
パターン②
それを設定する
if文が実行され、エラーメッセージが表示されるif文は実行されず、エラーメッセージは表示されない

assert文はエラーメッセージの内容を指定できる

asssert文はエラーメッセージの内容を指定できます。エラーがでたときに、想定されるエラーの内容は対処法のヒントなどを表示するようにしておくと便利ですね。

そのためには次のように書きましょう。

assert 式, '表示される内容'

具体例がこちらです。

assert a==2, 'aは1ですよ'

これを実行すると、「AssertionError: aは1ですよ」と表示されるでしょう。

assert文の注意点

再び上述「if文を使って同じ機能を実現」で書いた、assert文を使うかわりに「if__debug__:」を使った場合を見てみましょう。

if __debug__:
    if not a==2:  # aが2じゃなければ、raise文が実行される
        raise AssertionError
    else:  # aが2のとき実行される
        print('OK')
if __debug__:
パターン①
コマンドラインオプションに「-0」を設定しない
パターン②
それを設定する
if文が実行され、エラーメッセージが表示されるif文は実行されず、エラーメッセージは表示されない

assert文はこのif __debug__の処理と同じ機能を果たします。すなわち、コマンドラインオプションに「-0」を設定した場合にassert文は実行されません。無視されます。

一方で、if文を使って次のようにエラーメッセージを出す処理も考えられます。

if 条件式A:  #条件式Aは「__debug__」以外
    raise AssertionError
else:
    ~

ここで条件式Aは「__debug__」以外の式です。

このようなif文を使ってエラーメッセージ(ここではAssertionErrorというメッセージ)を表示させる場合は、上述コマンドラインオプションで「-0」を設定した場合であっても、このif文は実行されてしまいます。

簡単に言ってしまえば、普通のif文(__debug__を使わないもの)はコマンドラインオプション「-0」の設定あり・なしで左右されず必ず実行されますが、assert文はコマンドラインオプション「-0」の設定があれば実行されません。

これが大きな違いとなります。

もしassert文(if __debug__~の場合も)が実行されたかどうかという結果によって重要な機能が影響を受けるようなプログラムを書いてしまうと、コマンドラインオプションで「-0」を設定してPythonを実行させた場合に、そもそもassert文が無視されるため、その重要な機能が実行されませんので、とんでもないことになります。

あくまでassert文はエラーメッセージを表示させるためだけの、開発作業の効率化に役立つためだけの機能・文法であって、プログラムの実行結果や性能に直接影響を与えるような使い方をしないことが大切です。

もしみなさんがこれからのプログラミング学習や転職などに悩みがあるならば、現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのも良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。

Webマーケティングコース

Webアプリケーションコース

データサイエンスコース

機械学習の基礎が学べる「Pythonコース」

など各種の講座が用意されていますので、自分の未来に沿った講座が見つかります。無料で体験できるテックアカデミー無料体験も用意されていますのでお得に利用してみてください。

初心者におすすめプログラミングスクール