このコンテンツは、2021年3月12日に社内で開催された、若手向けのオンライン勉強会の書き起こしコンテンツです。エラーの解決法はプログラミングをするエンジニアには共通することではありますが、特に当社ではPythonを使う若手メンバーのスキルアップのために、Pycharmを想定して説明しています。
記事の最後にQ&Aが記載されていますので、ぜひ最後までお読みください。

■スピーカー紹介
入社2年目のシステムエンジニアの萱沼広稀です。プログラミング歴は高校生の時からやっているので、9年目です。今はネットワーク機器設定の自動化の案件を行っています。

■勉強会の目標
今回のセミナーの目標は、
● エラー発生後の作業イメージができるようになる。
● Pythonでよく発生するエラーを知る。
● エラー発生時の調査手段を増やす。
● 既知の機能の理解をより深める。
■想定している環境
統合開発環境(IDE)はPycharmを使用し、Python3.9.2を今回の環境として説明していきます。Pycharmを選択している理由は、現在私が関わっている自動化案件でPycharmを使っているためです。
■エラー発生時の対応
エラーが発生した際、皆さんはどのようなことをしますか?

エラー解決の結論
結論を先に言ってしまいますが、問題点はスタックトレースで出力されています。
真因はデバッグで見つけて、そこをどのようにしたら修正できるかを考えます。

割り算プログラム
割り算プログラムがあります。これを実行しました。
しかしZeroDivisionErrorが発生してしまいました。

Pycharmのコンソールにはエラー内容、クリックするとソースに飛べるファイルパス、
エラーが起きている行数、エラーが起こっている関数名が出力されています。
また、一番最後の行がエラーの発生した場所が記されています。
デバッグの仕方

エラーが起きてしまったので、デバッグをしてみましょう。
では、先程のエラーが起きていた割り算を行うところにブレークポイントをおきます。
次に、Pycharmの右上にある虫 のマークをクリックします。
すると、ブレークポイントを設置した場所でプログラムが一時停止します。

割る数には0、割られる数には1が渡されています。
どうして0が引数に渡されて しまっているのでしょうか??
この割り算の関数の呼び元に戻ってみてみましょう。

割る数に0が渡されてしまっていますね。ここを1に修正してみます。
再度プログラムを実行してみましょう。
「Process finishied with exit code 0」が表示されましたね。
エラーも出ていません。これでエラーの解決ができました。
足し算プログラム

指定した数字までの足し算をするプログラムを作りました。
例えば3を関数の引数として 渡した場合、「6」が結果として戻ってくるような関数です。

しかし、実行してみると、結果と して「3」が返ってきました。
このようなロジックが間違っているプログラムだと、Python上ではそもそも間違った
ことはしていないのでエラーが出てきません。
デバッグをしてみましょう
足し算をforで行っているところがあるので、そこにブレークポイントを置いてみましょ う。iが1, 2, 3と変化して行くのが2までしか増加していないことがわかりました。
「range」という関数はrange(start_index, end_index)を渡すのですが、今回は1と3が引数として渡されています。range関数は、3より小さい数まで繰り返すので、range(1, 3+1)にすることによって、4より小さい数まで繰り返すようになり、3 まで足し算することができます。
再度実行してみましょう。すると結果として6が返ってきました。
■デバッグ機能の紹介 プログラムの操作

私がデバッグ機能でよく使用するのは、「メソッドの中の処理は実行するが止めない機能」と、「メソッドの中は実行するが止めない機能」です。
大きなシステムになるほど、デバッグしている際に色々なファイルを開くので、どこまで実行していたかわからなくなる時があります。そんな時に実行している場所に1クリックで戻れるので、便利です。
「メソッドの中の処理は実行するが止めない機能」はデバッグをする際、変数の変化だけを見たい時や、各メソッドの処理に問題ないはないけれど、戻り値だけ確認したいことが多いので多用しています。
変数監視機能

● +ボタン:監視する変数を追加
● ーボタン:監視する変数を削除
● ↑↓ボタン:変数の順番入れ替え
● コピーボタン:監視している変数をコピー
■Pythonでよくあるエラー
- SyntaxError:構文エラー。
- NameError:変数名が定義されていない。
- TypeError:型が違う。”2” + 2のような計算をしようとした時に発報される。
- ValueError: int(”s”)のように渡した値が間違っていると出るエラー。
- KeyError:指定するキーが間違っている。
- ModuleNotFoundError:モジュールが見つからない。インポートエラー
- FileNotFoundError:指定したファイルが見つかりません。
■Python便利機能
Pythonはインタプリタ言語なので、対話式でプログラムを実行することができます。
軽い構文確認や、RESTAPIの確認等に使うことができるのでとても便利です。自動化案件では正規表現を多用するので、正規表現を確認する際に使っています。
対話式でプログラムを書くのはJavaでも実際はできるみたいです。

コンソールを起動すると、プロンプトが出てきて、そこに数式などコーディングをするとリアルタイムで、プログラムを実行して行きます。if文やクラス定義などもできます。
■Q&A

Q1: Pythonに慣れるための学習教材(サイトでもアプリでも)でおすすめのものは何かありますか?
A1:Pythonに慣れるための学習教材としては、Pythonチュートリアルを使用していま
す。最近はUdemyは、良い講座が多いので利用しています。
技術を身につけるための勉強について持論を言うと、
とにかく手を動かしてトライアンドエラーを繰り返しながら覚えていくのが一番良いと思います。
読むだけだと使えるようにはならないと思うからです。
Q2:デバッグのやりやすさなどはpycharmとその他のエディターで差はあり
ますか?
A2:私はVSCodeが軽くて好きなのですが、それとPycharmで差があるかというと、
そこまで差は感じません。強いて言うなら、PycharmはJavaベースなので、
少し動作がモサッとしています。それくらいですかね。
Q3:Pythonを書けるようになる為に、どのような学習をしてきましたか?
A3:とにかくコーディングして、いろんなアプリ作って、トライアンドエラーを繰り返していました。やっぱり読むだけだと理解や実務では使えるようにはならないので、
言語が実際のシステムで、どのように使われているのか調べながら手を動かすと、
一番理解できますね。
Q4:エラーとかを調査する差に、よく参考にしているサイトは?
A4:https://note.nkmk.me
上記サイトは細かく説明が書いてあるので参考にしています。
エラーの調査は、大体「エラー」でググれば出てくるので、Google先生ですかね。
Q5:VSCode(Visual Studio Code)で使用している拡張機能はありますか?
Q5:Indent RainbowとRainbow Bracketは見やすくなるのでいいですね。特にPythonはインデントが重要なので、色を分けることによって見やすくしています。ブラケットは、括弧がたくさんあると、どれがどの括弧なのかわからないので、色分けしてくれるこの拡張機能は重宝しています。
勉強会は以上です。
コロナ禍なので、オンラインでの開催となりましたが、
早くみんなで集まって勉強会をできるようになりたいですね。