0
Help us understand the problem. What are the problem?

posted at

Organization

【mypy】リストに複数の型のデータを入れてはいけない【Python】

はじめに

プログラミング初学者です.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)]

参考文献

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?