Python のエラーメッセージを日本語表示する「etupem」

Pythonista の皆さんはじめまして。私はふだんは Ruby ばかり書いている根っからの Rubyist なのですが、わけあって Python に触れることになったので、せっかくだから Python で何か作ってみようと思いました。

そこで、Ruby で私が作ったものの一つに「[Eturem](https://qiita.com/nodai2h_ITC/items/9d49c3b291793a1fcd45)」というエラーメッセージを初心者向けに日本語で表示する gem（Python で言うところの pip）があるので、その Python 版である「[etupem](https://pypi.org/project/etupem/)」というものを作ってみました。

# はじめに

Python でも Ruby でも他のプログラミング言語でも、「エラーへの対処」は初心者にとって難しく、挫折を生みやすいところの一つだと思います。

特に初心者にとっては、エラーメッセージが英語で表示される時点でハードルが高くなってしまいます。TypeScript のようにエラーメッセージを日本語で表示できるプログラミング言語もありますが、そうした言語はごく一部です。

そこで本来英語表示されるエラーメッセージを日本語化することで、少しでも初心者が挫折しにくくなってくれればと思って作ったのが「Eturem」や「etupem」なのです。ちなみに Easy To Understand Ruby/Python Error Message の略。

# インストールと使用方法

```
$ pip install etupem
```

でインストールし、使用する場合は 以下のように普段「python」と書くところを「python**ja**」に変えるだけです。

```
$ pythonja script.py
```

ちなみに Python 3.8 以上であれば動作しますが、3.10 以上を使用することをオススメします。なぜなら もともとの Python のエラーメッセージが [3.10 以降詳細になっている](https://www.python.jp/news/wnpython310/improve-errormsg.html)からです。そのため etupem を使用した場合も、Python 3.10 以降の方が詳細なエラーメッセージになります。

## 使用するとどうなるか

例えば、以下のスクリプトを実行してみましょう。

```python:type_error.py
print("123" + 456)
```

通常の Python で実行した結果がこちらです。

![etupem1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180658/649b7f4c-105d-e0bc-7eee-9cf97c3ea8cd.png)

一方、etupem を使った場合がこちら。

![etupem2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180658/29bf176d-3af4-089c-d20e-50a1834e10fc.png)

```
Traceback (most recent call last):
  File "E:\scripts\type_error.py", line 1, in <module>
    print("123" + 456)
TypeError: can only concatenate str (not "int") to str
上に表示されているのが本来のエラーメッセージです。エラーについて調べる場合は、上のエラーメッセージで検索して下さい。
【型に関するエラー(TypeError)】
ファイル「E:\scripts\type_error.py」の 1行目でエラーが発生しました。
    print("123" + 456)
文字列に 整数(int型)を結合することはできません。
```

このように、

- 色付きで表示することで、情報をつかみやすい。
- 日本語で表示されるので、英語に拒否反応が出る人でも安心。
- エラーによっては、本来のエラーメッセージよりも詳細なメッセージを表示する。（後述）

というメリットがあります。

### より詳細なメッセージ例

「エラーメッセージが日本語になったからといって、エラーに対処できるとは限らないのではないか？」と思われた方もいるでしょう。確かにそれはその通りです。

例えば `ModuleNotFoundError` の場合、Python 本来のエラーメッセージは `No module named 'foo'` というそっけないものです。これを `'foo' という名前のモジュールがありません` と ただ日本語に訳したからといって、「モジュールが無い？じゃぁどうすればいいの？」と困ってしまう人も多いでしょう。

ところで `ModuleNotFoundError` が出る理由は、大きく二通りではないでしょうか。

1. スペルミスで、存在しないモジュールを指定している。
2. インストールされていないモジュールを指定している。

そこで etupem を用いた場合には、以下のようなエラーメッセージを表示しています。

```
モジュール「foo」が見つかりません。このモジュールがインストールされているか、スペルミスをしていないか確認してください。
```

このように、単にエラーメッセージを日本語化するだけではなく、できるだけそのエラーの原因のヒントも併せて書くようにしています。

# 想定される質問とその回答

## 解決策に辿りつきにくくなってしまわないか？

たとえばこの Qiita 上にも、「Python でこういうエラーが出たら、こう対処すればいい」といった記事が多数あります。自力でエラーを解決できなかった人がエラーメッセージで検索してそうした記事に辿りつき、無事エラーを解消できた…ということは多いでしょう。

しかしエラーメッセージが多言語化されると、解決策の書かれたページに辿りつけなくなってしまうのではないか…という心配をされる方もいるでしょう。（実際 TypeScript でも、そうした理由でエラーメッセージを敢えて英語に設定している人も居るようです。）

ですが etupem の場合、上の例を見てもらえばわかるように、もともとの英語エラーメッセージも表示されます。さらに `上に表示されているのが本来のエラーメッセージです。エラーについて調べる場合は、上のエラーメッセージで検索して下さい。` という注意書きも表示されます。ですので、解決策に辿りつけなくなってしまうという心配は少ないのではないでしょうか。

## 英語のエラーメッセージが読めるようになるべきではないか？

確かに、最終的には英語のエラーメッセージが読めるようになるべきだと思います。

ですが、それはいきなり最初からできるようになる必要はないとも思います。Python プログラミングで言えば、例えばいきなり最初からコルーチンとか正規表現とかを使いこなせるようになる必要はないでしょう。まずは基本的なことができるようになることが大事で、それができてから高度な機能を学べばいいと思います。

エラーへの対処も同様で、英語のエラーメッセージを読めるようになるのは後でよくて、まずはエラーメッセージからエラーの原因を推測し対処する方法を学ぶことが大事ではないでしょうか。

## Traceback は日本語化しなくていいのか？

例えば以下のスクリプトを etupem で実行すると、

```python:traceback.py
def aaa():
    bbb()

def bbb():
    ccc()

def ccc():
    print("123" + 456)

aaa()
```

以下のような表示になります。

![etupem3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180658/ad083605-cfa5-d045-6dc8-f01688223ed1.png)

ご覧のとおり、Traceback 部分は日本語化されていません。正確には一番最後の Traceback だけは `ファイル「E:\scripts\traceback.py」の 8行目でエラーが発生しました。` という形で日本語表示されていますが、途中の Traceback は英語表記のみです。

ですが、etupem はあくまでも初心者向けのものです。そうした初心者が遭遇するエラーの大半は、Traceback を追いかけないと分からないような複雑なものではないでしょう。ですので何でもかんでも日本語化するのではなく、ピンポイントで重要と思われるところのみを日本語化しています。

# 終わりに

「エラーメッセージをこうした方がもっとわかりやすくなるのでは？」等のご意見がありましたらよろしくお願いします。

それからここに書いても恐らく無駄だとは思いますが、日本語以外の言語にも誰か対応させてくれればいいなぁと期待しています。（見てもらえば分かりますが非常に単純な作りなので、`ja.py` をコピーして少し書き換えれば簡単に他言語に対応できると思います。）