0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

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

参考文献

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?