matobaの学んだことスマートフォン用の表示で見るmatobaの学んだこととあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。オープンソースこんにちは。Calendarの4日目の記事です。Calendarの記事です。登録してたことを忘れていました。今日は、僕がPythonのデバッグをするときによくやることを紹介します。1年前の僕だとスムーズにできなかったこともたくさんあるので、参考になれば、と思います。あと、僕も勉強中の人なので、これやるともっとスムーズだよ。言うのがあれば教えてもらえるとありがたいです。言う関数をデバッグします。この関数は、与えられた文字列をparseしてdatetime.datetimeのオブジェクトにして返します。datetime.datetime)とりあえず、pytestを使うとちょっと違う話になると思いますが、今回は置いといてください。これを以下の環境でユニットテストを実行すると通ります。0.000sOKしかし、この関数は、引数に「"1986-07-05T08:15:30z"」を渡すとエラーが出ます。そのエラーを解消したい。エラーが出るユニットテストを書くエラーが出てそれを解消するとき、まずはエラーが出るユニットテストを書くのがスタート地点です。ないと何を直してるのかわからなくなります。以下のようなことを繰り返して疲弊します。あるエラーを直した後に別の修正をして同じエラーに苦しむ。別の修正をしたときにデグレートしたことに気づかず、後になって気づく。あっちを直せばこっちが壊れ、こっちを直せばあっちが壊れる。何をどう言う状態にしたいのかを明らかにして、それを解消する、と言うふうに一歩一歩前に進むといいでしょう。そのためにユニットテストを書きます。1年前の自分に伝えたいです。追加後のテストコード。(errors=1)デバッグできた。このテストが通るようになったことを意味することにしましょう。エラーメッセージでググる当たり前すぎるので、詳しくは書きませんが、とりあえず最初は、エラーメッセージでググりましょう。似たエラーがあれば、そこで問題は解消します。今回は、ググってすぐにわからないパターンを考えます。オープンソースのライブラリです。Pythonのライブラリの多くはオープンソースです。多くの場合、githubにリポジトリがあって、issueが立てられます。複数の人が遭遇した問題は、issueに登録されている可能性が高いです。言うわけでIssueを検索しましょう。ちなみにリポジトリのIssueは、Google検索にあまり引っかかりません。自分でライブラリのリポジトリを探して、リポジトリの検索窓から検索する必要があります。リポジトリは、PyPIから探すといいです。pypi.orgいつもpipでインストールしているライブラリは、PyPIで管理されています。PyPIには、ライブラリごとにページがあります。ライブラリのページには、そのライブラリのリポジトリが登録されていることが多いです。場合は、ここがPyPIのページになります。pypi.orgそこからリポジトリを見つけます。だいたいgithubにあるので、githubの検索窓から探しても良いと思います。github.com次に、Issueを探します。検索キーワードは、エラーメッセージが良いでしょう。今回の場合は、上記のキーワードで探すと次のIssueが見つかります。github.comまあ、今回は、Issueが見つからなかった、と言うことで進めます。venv環境の動いてるコードを見る未知のエラーに遭遇した場合、エラーがどこで発生しているかを確認しましょう。ユニットテストで出ているスタックトレースを見ます。今回の場合、以下を見ます。言うファイルの648行目でエラーが出ています。言うのは今回作成したvenvのパスです。中にライブラリのコードがインストールされます。実行時はそこを参照しているわけです。普通に以下のようにすると、そのファイルを開くことができます。行目にカーソルを移動して開くことができて便利です。+648pdbでブレークポイントをうって挙動を確かめるライブラリのソースコードを開いて、該当箇所を見たらだいたい何が起きたのかわかる時もあります。わからない時は、pdbを使って挙動を確かめます。pdbはPythonデバッガーです。以下のように追加します。datetime.datetime)これでテスト実行するとデバッグモードに入れます。648行目なので、以下のように指定します。/home/ubuntu/debug_sample/venv/lib/python3.6/site-packages/dateutil/parser/_parser.py:648すると、エラーが発生する行を実行する直前で止まるようになります。実行すると次のブレークポイントまで進みます。押すと、該当箇所のコードが見れます。変数の中身を見れます。timestrの文字列を渡した時に、resがNoneだったからエラーが出たんだなーといのがわかります。こんな感じで頑張って掘っていくと、Issueに書いてある問題が見つかると思います。その他1:gitリポジトリをcloneして見るもっとライブラリの処理の内容が知りたくなってきたら、リポジトリをcloneします。venvの中で見てもいいのですが、gitリポジトリがある方が何かと便利なことがあるので、cloneしちゃいます。インストールされていたコードと同じコードがあるはずなので見ます。ライブラリをバージョンアップした時は、前のバージョンのコードを見たい時があります。言う時は、gitリポジトリを操作して、指定したバージョンに切り替えてコードを見ます。showを使うバージョンアップした時は、知らないうちに挙動が変わることがあります。Noteに書いてる時もあれば、書いてないこともあります。blameを行います。blameを使うとそのコードがいつ変更されたのかを知ることができます。dateutilのリポジトリで以下のように実行すると、644-650の行がいつ更新されたのかを知ることができます。これで少なくとも1年以内の更新ではないんだな、などのことがわかります。修正されたコミットの内容を見る時は、以下のように実行します。"hour",これは、エラーが出た時のメッセージが改善されたコミットですかね。こんな感じで、該当の行がどう言う理由でいつ変更されたのかを知ることができます。コミットにはIssue番号が付いている時もあるので、ついている時はそこからさらに詳細な情報を追うことができます。終わり今回は、僕がPythonのデバッグをしている時によくやることを紹介しました。僕は、基本的にコマンドラインだけで開発してるのでこんな感じになってますが、GUIアプリを使うともっとスムーズにできるのかもしれません。*1他にもこれ使う方が便利だよと言うのがあれば、また教えてもらえればと思います。*1:ちなみに僕がコマンドラインだけで開発してる理由は、GUIアプリはよくバグる印象があるし、バグった時に無力でイライラしてしまって精神衛生上よくないからです。22:17僕がPythonのデバッグをするときによくやることTweet関連記事2018-12-20djangoのformって結局なんなの?という疑問が解消されたのでformを解説しますあー、djangoのformってそういう役割なのかー、というのが自分...2018-10-21興味本位でNimを少し触った興味本位で、Nimってプログラミング言語を触ってみた。2018-07-03gitで特定の行がそうなっている理由を調べるgitで特定の行がそうなっている理由を調べることがあります。...2018-04-30Mezzanineを触ってみるMezzanineを触ってみてます。Mezzanineは、Djangoで作られたWo...2018-04-29Docker初心者のはじめの一歩Dockerを使うことになりました。(30)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。