みんなのPython勉強会#102『Pythonプログラミングとエラーの話』
3/28, 2024
辻 真吾（@tsjshg）

自己紹介
•

『Pythonスタートブック（技術評論社）』『ゼロからはじめるデータサイエンス入門（講談社）』などPythonとデータサイエンスに関する著書多数•

みんなのPython勉強会の運営スタッフ•

数理工学の他に生命科学やエネルギー分野にも詳しいです•

最近は1bit LLMに興味があります••

https://github.com/kyegomez/BitNet

www.tsjshg.info

『科学文明の起源』
ヨーロッパ、南米、アジア、アフリカなど世界のそれぞれの地域で発展した科学文明が、15世紀半ばからの大航海時代のような世界的な交流によって相互作用することで現代の科学文明が形作られたと主張
日本人も何人か登場しますが、名前を一度も聞いたことが無い世界中の科学者たちの偉業が丁寧に描写されていてとっても楽しい！
https://str.toyokeizai.net/books/9784492800959/

もくじ•

エラーの基本とエラーメッセージの進化•

エラーメッセージは何故長いのか？

•

RDBMSなどPythonの外側の機能とエラー•

ライブラリのインストールとエラー•

エラーの解決方法

エラーは2種類（Pythonだとあまり意識しないかも）•

文法的な間違い•

文法的には正しいにも関わらず起きる想定外のハプニング•

例外（Exception）

スペルミス
文字列を引数の文字で区切ってリストにしてくれるsplitメソッド

スペルを間違えてエラー
Did you meanで、正しいメソッド名を提案してくれている（3.10〜）

モジュールのimport忘れ
0以上1未満の小数をランダムに得る

3.12からimportし忘れてない？と言ってくれるようになったメソッドや関数には（）が必要

乱数を発生させるという期待した結果は得られていない
Pythonとしては、言われたとおりの動作（メソッドの表示）逆の勘違いはエラーになる
datetime.date型のday属性（日付）にアクセス←これが正しいメソッドと勘違いしたときのエラーがすこし分かりにくい
整数型（int）に（）を付けてcallしようとしてエラー引数の指定キーワード引数のあとに位置引数は置けない

キーワード引数を使えばこれはOK引数の数←「あ」の文字コードを調べる← 文字コードから文字を作る

1つしか引数をとらない関数に余計な引数を渡してエラーすこしわかりにくい例←今いる場所を示すPathオブジェクト←絶対パスを表示←間違えて変な引数を付けてしまう（訳）Path.absoluteは1つの位置引数ととりますが、2つ渡されました。

クラスのメソッドは第1引数を必ず必要とする（通常self）ため、いつも＋1の数字がエラーメッセージになるエラーはなぜ長いか？
ネコを表現するクラス子猫だったら「にゃー」と言う（バグあり）

普段利用しているライブラリは化け物のような巨大クラス

Traceback (most recent call last)とあるように、最後が最新の呼び出し
まずは一番下を見る

Relational Database（RDB）とは•表（table）で管理されるデータとそれらの関係性を保持•

RDBMSはRelational Database Management System•

RDBを管理するための専用のソフトウェア•

SQLという専用の言語で操作•

商用ではOracleが有名、Microsoft SQL Serverもある•

オープンソースでは、Oracleに飲まれてしまったMySQL、PostgreSQL、SQLiteなど•

PythonにはSQLiteの機能が標準モジュールにある•

Sakilaというサンプルデータベースを使って紹介•

レンタルビデオ屋さんのシステムを想定したデータベース

ER（Entity Relationship）図

テーブルとその関係性を専用の記号で表現した図
https://github.com/bradleygrant/sakila-sqlite3

標準モジュールを使った例

普通はRDBMSのサーバに接続

RDBMSは条件検索や並べ変えが速いpandasが便利
前のページで作ったSQL文とConnectionオブジェクト

結果がDataFrameになるSQL文を間違えた場合

正しくは lmテーブル

fi

テーブルが存在しないというSQL文のエラーが出ている

Pandasのメソッドを利用した場合

例外が連鎖する場合、直接の原因が最初に表示されている
During handling of the above exception, another exception occurred:という文の時もあるライブラリのインストールで起きるエラー•

外部ライブラリをpipでインストールするときにもエラーは起きる•

pip install ○○とやったとき、○○が別のライブラリに依存していることが多く、そのライブラリのインストールでエラーが出ることが多い

•

主な原因
•

使っているPythonのバージョンとそのライブラリのバージョンの不•整合
依存関係にあるライブラリ同士のバージョン問題などなど•

ERROR: Failed building wheel for ○○パッケージをコンパイルしようとしている（だいたい失敗する）

PyPIのサイトでバージョン確認

この場合、Pythonのバージョンを3.8にすればOKまったく別のパッケージをインストール中ImportError: cannot import name ‘escape’ from ‘jinja2’

エラーメッセージをそのままGoogleへ投げ込むFlaskが原因だとわかってくる

https://stackover ow.com/questions/71718167/importerror-cannot-import-name-escape-from-jinja2

https://tkstock.site/2023/02/03/python- ask-jinja2-import-error/#google_vignetteflfl

Flaskのアップデートで無事解決

エラーの解決策•

エラーメッセージの進化•

Python3.10からエラーメッセージが親切になる改良が続いているの•で、まずはエラーメッセージを読んで理解する習慣をつける
慣れてくればエラーメッセージから原因がすぐにわかるようになる•（残念なお知らせ）Jupyter環境では改良されたエラーメッセージが全部は利用できない•

エラーメッセージをそのままGoogle検索••

適切な場所を切り出せるスキルは重要（これも経験の積み重ね）

AIに教えてもらう•

ChatGPTは使ったことないですが、Google Colab Proの機能は便利←ここを押す

子猫は「にゃー」なので0が正解ですが、そんなことAIが知るわけ無いまとめ•

エラーメッセージを読んでエラーに慣れよう！
• エラーメッセージのどこを見るか• 基本は一番下だけど、例外が連鎖する場合は上の方に直接の原因が来ていることもある•

そのままGoogle検索は有用••

どこを投げ込むか？を判断できる経験を積もう

エラーの解決はAIを上手に活用できる分野の1つ•

Google Colabはいろいろ教えてくれるのでスキルアップに使えそう

参考資料
••

•

Pythonのエラーメッセージの読み方と対処法••

https://www.pythonic-exam.com/archives/6318
寺田さんの記事•

今日は話題に入れなかったtry-exceptの解説もあります

Python 3.10から導入されたBetter error messagesの深掘り••

https://gihyo.jp/article/2022/12/monthly-python-2212
たかのりさんの解説記事•

Cのソースまで載っていてホントに深掘っている感じ

IPythonのエラーメッセージへの対応•

https://github.com/ipython/ipython/issues/13445

ご静聴ありがとうございましたー