はじめに
プログラミング初学者です.Pythonで書いたコードをmypyでチェックした際に起きたエラーとその解決方法を共有します.
環境
- Python 3.9.4
- mypy 0.940
ターミナル
$ python3 --version
Python 3.9.4
$ mypy --version
mypy 0.940
mypyエラー発生時のコード
キャラクターの名前と身長を格納したリストを身長順に並び替えるというプログラムです.
sort.py
kimetsu_height: list[list[str, float]] = [
['tanjiro', 165],
['nezuko', 153],
['zenitsu', 164.5],
['rengoku', 177],
['inosuke', 164]
]
sorted_kimetsu_height = sorted(kimetsu_height, key=lambda x: x[1])
print(sorted_kimetsu_height)
また,実行結果は以下の通りです.プログラムとしては問題なく動いています.
ターミナル
$ python3 sort.py
[['nezuko', 153], ['inosuke', 164], ['zenitsu', 164.5], ['tanjiro', 165], ['rengoku', 177]]
発生したmypyエラー(エラー①)
次のようなエラーが出ました.
ターミナル
$ mypy sort.py
sort.py:1: error: "list" expects 1 type argument, but 2 given
Found 1 error in 1 file (checked 1 source file)
エラーに対する解決方法
リストには一つの型のデータしか入れられないことが原因でした.
['tanjiro', 165]
上記のように,リストに複数の型のデータを入れてはいけないそうです.
そこで,代わりにタプルを用いました.タプルには複数の型のデータを入れることができます(詳しくは参考文献をご参照のこと).
sort.py
kimetsu_height: list[tuple[str, float]] = [
('tanjiro', 165),
('nezuko', 153),
('zenitsu', 164.5),
('rengoku', 177),
('inosuke', 164)
]
sorted_kimetsu_height = sorted(kimetsu_height, key=lambda x: x[1])
print(sorted_kimetsu_height)
すると,mypyテストをクリアすることができました!
ターミナル
$ mypy sort.py
Success: no issues found in 1 source file
プログラムも問題なく動きます.
ターミナル
$ python3 sort.py
[('nezuko', 153), ('inosuke', 164), ('zenitsu', 164.5), ('tanjiro', 165), ('rengoku', 177)]