Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はPythonのちょっとしたお役立ちテクニック?として、assert文というものをご紹介・解説します。
assert文は、何かプログラムでエラーが出たときに、そのエラーの内容・場所を探りやすくするための情報を提供ものです。それによりプログラミングがより効率的に進みます。
言い換えると、プログラムの処理の流れを作ったり処理の内容や順番のような「ロジック」に直接関係するようなものではなく、あくまでエラー情報を知らせるためだけの機能を実現する文と言えます。
Contents
assertは英語で、その意味は「強く主張する」という意味です。
上述のように、Pythonのassert文は、エラーの情報をしっかりと明示してくれるという感じになります。
assert文は、Pythonの単純文 (simple statement)の1つです。そしてその使い方ですが、まず公式ドキュメントによると以下のように説明されています。
assert_stmt ::= "assert" expression ["," expression]
ここで使われている単語の意味は、それぞれ
stmt(statementの略) | 文 |
expression | 式 |
となります。
そしてこの公式ドキュメントで書かれている内容の解説については次の画像を見てください。
この画像の説明が完全というわけではないのですが、公式ドキュメントで今回の説明と同じような単語や記号を使って説明されている場合は、上画像の内容を思い出して見てください。そうすると理解しやすくなると思います。
では次に具体例を見てみましょう。
以下の単純なコードを見てください。
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}'
オプションの部分に、エラーメッセージの内容として、
を設定しました。
フォーマット済み文字リテラルは実行されると式として評価されるので、式として使えるのです。
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文は実行されず、エラーメッセージは表示されない |
asssert文はエラーメッセージの内容を指定できます。エラーがでたときに、想定されるエラーの内容は対処法のヒントなどを表示するようにしておくと便利ですね。
そのためには次のように書きましょう。
assert 式, '表示される内容'
具体例がこちらです。
assert a==2, 'aは1ですよ'
これを実行すると、「AssertionError: aは1ですよ」と表示されるでしょう。
再び上述「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文はエラーメッセージを表示させるためだけの、開発作業の効率化に役立つためだけの機能・文法であって、プログラムの実行結果や性能に直接影響を与えるような使い方をしないことが大切です。
プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。
など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。