CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
こんにちは、吉政創成 アシスタントの菱沼です。
第5回目となる今回も「いちばんやさしいPython入門教室(大澤 文孝氏著)」を片手に勉強していきます。
さて、前回はPython用の統合開発環境IDLEを使って、カレンダーモジュールでいろいろ遊んでみました。今回は、以前、すこしだけ触れたエラーメッセージについてまとめてみたいと思います。
テキスト(Lesson2-5 P40、41)ではエラーメッセージについてこのように記述されています。
・エラーの代表は、文法が間違っているときです。
・「SyntaxError (シンタックスエラー)」は、文法エラーの代表で、スペルを間違えた時はかっこの使い方が違うときなどに良く表示されるエラーです。
・他にも、いくつかのエラーがあります。たとえば、「0 で割る」ことは、数学では許されていません。そのため、「10/0 」のように10 を0 で割ろうとしたときは「ZeroDivisionError 」というエラーになります。
ではここで、以前、私がIDLEを使っていろいろ遊んだ時に出したエラーメッセージにご登場いただきます。
テキストで紹介されていた「SyntaxError」と「ZeroDivisionError」は、実際にはこの画像に書かれているメッセージで表示されます。赤字で表示されるので、見落とすことはありません。また、「1+2=」の行に赤いラインが入っていますよね?これはここに構文のエラーがあるよ!と教えてくれています。
さて、
・SyntaxError: invalid syntax
・ZeroDivisionError: division by zero
「:(コロン)」を間に入れて前後に英文が表示されていますよね?これはどういう意味なのかはテキストに説明がありました。
引用)エラー名とエラー内容から、どこが間違っているのか、おおよそ推測できるわけですね
ということなので、「SyntaxError」が発生していて、その詳細は「invalid syntax」だよ!ということになります。
この例で言えば、「Syntax=構文」、「invalid=無効」なので、「構文エラーが発生していて、その理由は文法が無効なものになっているからだよ!」ということになります。実際、1+2をPythonで計算したい場合、「=」は要りませんので、「=」が邪魔よ!と怒られていることがわかります。
SyntaxErrorは、スペルを間違えた場合や、括弧や「'」「"」の使い方の誤りや不足といった場合にも表示されます。また、インデント(行頭に入れる空白)の入れ方が間違っているケース(unexpected indent=予期しないインデント)にも表示されるようです。そのため、一番遭遇頻度が高そうなエラーです。
さて、ここまで見てわかる通り、Pythonのエラーは英語で表現されます。他にもエラーがあるということなので、どういったものがあるのか代表的なものを探してみました。
この後に書いていくものは、色々なサイトを巡った結果、よく見られるエラーと思われるものです。
エラーの内容が掛かれているものがあれば併せて記載しました。これ以外のエラーメッセージに関しては最後にご紹介するPythonの公式サイトをご確認ください。
エラー名 |
意味 |
理由の例 |
SyntaxError |
文法エラー |
・invalid syntax(構文) ・unexpected indent(要らないインデント) ・duplicate argument 'x' in function definition(関数xが重複) ・keyword argument repeated(引数のキーワードが重複) ・EOL while scanning string literal('や"で締められていない) ・Missing parentheses in call to 'x'(Xを呼び出すのに必要な括弧が不足) |
IndentationError |
インデントにミス |
・unexpected indent(要らないインデント) ・nindent does not match any outer indentation level(インデントが一致しない) ・expected an indented block(インデントがない) |
ImportError(v3.6以前) ModuleNotFoundError(v3.6以降) |
importで指定したモジュールが見つからない |
No module named (そんな名前のモジュールありません) |
AttributeError |
オブジェクトや識別子(属性やメソッド)の名前やオブジェクトの型を間違えている |
'X' object has no attribute 'Y' (オブジェクトXにはYという属性がない) |
TypeError |
関数の引数に不適切なデータ「型」が渡されている |
・'x' object is not callable(オブジェクトxが呼び出せない) ・unhashable type(可変オブジェクトなどをディクショナリーオブジェクトのkeyに入力されている) ・"1"+3では1が文字列なため、足し算できない →can only concatenate str (not "int") to str |
ValueError |
関数の引数に不適切な「値」が渡されている |
1などの数字を入れるべき関数の引数の部分にそれ以外の値を入れている場合 →invalid literal for int() with base 10: 'ichi' |
ZeroDivisionError |
0で割り算されている |
division by zero |
NameError |
名前が見つからない |
name '(変数名)' is not defined(変数名のファイルが見つからない) |
IndexError |
インデックス番号で要素を取り出せるデータで、範囲外のインデックス番号を指定されている |
list index out of range(リストのインデックス範囲外です) |
KeyError |
辞書登録外のキーが指定されている |
|
FileNotFoundError |
指定されたファイル/ディレクトリがない |
No such file or directory: '(指定した名称)' |
FileExistsError |
既に存在するファイル/ディレクトリ |
|
UnicodeDecodeError |
作成時に使用した文字コードではない文字コードで復号している |
|
UnicodeEncodeError |
書込み時に符号化(エンコード)できない文字がある |
|
UnboundLocalError |
ローカル変数を定義する前に使用されている |
・local variable 'X' referenced before assignment (ローカル変数Xは代入するまえに読まれている、つづりを確認) |
ちなみに、何回かエラーメッセージで見た中に「EOL」という文字がありました。これは「End of line」の短縮で、行末・改行コードを示すプログラム言語における用語となります。
上記のエラーメッセージの参考でお世話になったページは以下になります。より詳しい説明も読めますので、ご興味のある方は各サイトでご確認ください。
参考サイト:
Pythonの基本的なエラー一覧とその原因の確認方法|note.nkmk.me
Pythonエラー一覧(日本語)| Qiita @soutarrr7
Pythonのエラーの見方とよくあるエラー | GAMMASOFT
エラーが発生した場合、エラーメッセージに基づいて対応をしていく必要がありますが、それでもうまくいかなかった場合、何処に注意すればいいのでしょうか。テキスト(P78)ではつぎの点に気を付けて見直ししていくといいと書いてありました。
【うまくいかないときのチェックポイント】
・大文字と小文字の区別は正しいか
・全角文字で入力していないか
・行頭の空白の数は楽しいか(指定されない限り、行頭には空白を入れない)
・括弧の対応が間違っていないか
・シングルクォーテーション(' )やダブルクォーテーション(" )が間違っていないか
・文字コードは正しいか
・日本語を使っているとき、1 行目や2 行目に「coding=utf-8 」もしくは「conding:utf-8 」を記述したか
・ファイル名に日本語を使っていないか
また、今回、エラーについて調べていく中で「例外」という言葉を見ました。例外は、構文や名称に問題がないのにプログラムの実行中にエラーが発生してしまうことを指します。
例えば、
・0で割ろうとした
・文字列を数値に変換しようとしたが、不正な文字列だった
・ファイルに書き込みできなかった
(引用: Pythonで例外処理を行う方法【初心者向け】|TECH ACADEMY magazine )
こういったことが原因で例外が発生してしまった場合、tryという関数を利用して、例外の発生有無によってどういった対応を行うかを定義することになります。Pythonの公式サイトで例外について解説しているページがありましたので併せてご紹介。
エラーが出てしまったとき、エラーメッセージの意味を読み取ること、チェックポイントを見直すこと、例外にあたるものでないかといった観点を忘れないようにしたいと思います。
それでは今回はこれで終了です。ありがとうございました。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes