Python

Python基礎:デバッグ

スポンサーリンク

はじめに

今回はデバッグについて触れます。これまでPythonで遭遇するエラーに関しては、次の記事で扱っています。合わせて参照してください

前にエラーを扱った投稿では10個のエラーを紹介しましたが、今回はエラーを大きく3つにわけて紹介します。そのうえで、論理エラーをデバッグする際の具体例を示すようにします。さっそく見ていきましょう。

エラーの種類

ここではエラーを大きく3つに分類します。「文法エラー」「実行エラー」「論理エラー」です。それぞれ、Syntax Errors、Runtime Errors、Logical Errorsといいます。

Syntax Errors

これは文法エラーですが、エラーメッセージの最終行に「Syntax Errors」と表示されるのですぐにわかります。何度かデバッグしているとその傾向もわかってきますが、括弧の閉じ忘れやコロンの付け忘れ、全角のスペースなどが問題となることが多いです。エラーを引き起こしていると思われる、箇所を「行番号」(line XX)で示してくれるので、その付近に文法エラーがないかを探すのがデバッグの第一歩となります。

Runtime Errors

実行エラーは、コードの実行時に検出されるエラーです。 前回紹介したよく見るエラーでいうと、↓などはこれにあたります。

  • NameError
    これは定義していない変数名を使用した際に起こるエラーとなります。定義し忘れや、割とよくあるのがスペルミスです。
  • AttributeError
    オブジェクトが持っていない属性を使用した際に起こるエラーです。いまいちど、オブジェクトがその属性を持っているのかをよく調べてみるとよいでしょう。
  • TypeError
    これは、誤ったデータ型同士の演算で起こるエラーとなります。そのため、エラー箇所の型を調べるとよいです。
  • ValueError
    データ型はあっているが、値が間違っている場合に発生するエラー。たとえば、0に関する計算だったり、正の値しか受け付けない演算に対して負数が指定されていた場合などが多いです。

エラーへの対処ですが、まずはじめに(当たり前ですが)エラーメッセージの確認とエラーが発生している箇所(line xx)を確認します。そのうえで、どの部分が実行エラーとなっているかを考えます。エラー箇所がわかりにくい場合は、コードを分割して、再度、実行することで、どの部分でエラーが起きているかを切り分けることができます。原因がわからない場合は、 print を挿入するなどして、処理の入出力の内容を確認すると、どこまではうまくいっていて、どこからがおかしい、というのがわかるでしょう。

Logical Errors

論理エラーは、プログラム自体の実行は可能であるため、わかりにくいですね。プログラムが意図したように動作しないというエラーです。 論理エラーは、基本的に入力と出力を1つずつ確認していき、どの箇所で、意図と異なる値を出力しているのかを特定する必要があります。

この入力と出力を確認する方法としてよく使われるのがprint文です。そのほかとして、assert文を書いておいて、期待する論理値と異なるケースの場合に、「Assert Error」を発生させてわかるようにする、という方法があります。

スポンサーリンク

論理エラーのデバッグ

print文

print文によるデバッグはコード例を示すまでもないでしょう。入力/出力で論理エラーが起こっていると思われる場所にprint文を挿入して値を確認していく作業となります。期待する値と実際に表示される値を比較してエラー箇所を特定する、という使い方となります。

Assert文

assert文は、使ったことがない方もいらっしゃるかもしれません。論理エラーを見つける際にとても有用な方法となります。(実は、私はAtomaのイベントの解説で知りました・・・)

実際にやってみましょう。前回の関数定義のところで年齢をカテゴリ化して年代として扱う、generationという関数を定義しました。これにassert文をいれてみましょう。年齢は必ず0歳以上ですから、与えられる年齢をageとすると、age>=0という前提条件があります。これをassert文で書いておきます。

def generation(age):
    import math
    generation=math.floor(age/10)*10
    assert age>=0
    return generation

こうしておくことで、前提条件に合致している際には、変わりなく実行できます。

generation(38)

前提条件に合致しない値が入力された場合は、次のようにAssertionErrorが発生します。

generation(-1)

このAssertionErrorによって、どの前提が満たされなかったかが簡単にわかります。

スポンサーリンク

まとめ

いかがでしたか?今回はデータ分析することで避けられない、コードのデバッグについてのお話を扱いました。コードにエラーはつきものなので、慣れてしまって、デバッグを楽しめるようになるとよいですね。

コメント

タイトルとURLをコピーしました