はじめに
Pythonでルコードを書いている時にエラーが発生。
表示されたメッセージは
TypeError: cannot unpack non-iterable NoneType object
というものでした。
どうやらループ処理でリストを処理している時に値を取り出そうとした時に問題が起きたようでした。
エラーと原因
エラーメッセージ
エラーメッセージの
TypeError: cannot unpack non-iterable NoneType object
は、「型のエラー:non-iterable NoneType objectはアンパック操作ができません。」というものです。
「イテラブルなオブジェクト」とはリストやタプル等が該当します。
原因
どうやら原因はPythonがイテラブルなオブジェクトから複数の変数に値を分割しようとした時(アンパックしようとした時)に、期待される形式の値を返さなかったことが原因だったようです。
これだけだと?となります(僕はなりました)ので次にエラーが出る簡単なサンプルプログラムを見てみましょう。
以下にエラーが出る簡単なサンプルソース(itr_error.py)です。
def get_data(condition):
if condition:
# chk_flgがTrueの場合
return ("Data1", "Data2")
else:
# chk_flgがFalseの場合
return None
chk_flg = False
x, y = get_data(chk_flg)
これを実行すると
Traceback (most recent call last):
File "/***/***/itr_error.py", line 10, in <module>
x, y = get_data(chk_flg)
TypeError: cannot unpack non-iterable NoneType object
というようにエラーが表示されます。
10行目のreturnでNoneを返そうとしていますが、x,y両方に値が入っていません
(本来はreturnで戻り値としてx,y双方に値が帰るようにしないといけないのにreturnは1つしか帰っていない)
このエラーを解決するためには、関数が返す値がアンパック可能(つまりイテラブル)であることを確認するか、返す値がNone場合の適切な処理を追加する必要があります。
ソースを次のように修正するとエラーが発生しなくなります
def get_data(condition):
if condition:
# chk_flgがTrueの場合
return ("Data1", "Data2")
else:
# chk_flgがFalseの場合
return None, None
chk_flg = False
x, y = get_data(chk_flg)
さいごに
今回はPythonでイテラブルなオブジェクトをアンパックする際のエラーでした。
実際書いていたソースではループ処理のときにNoneを返していたのですがエラーの例で示したサンプルソースのように値が上手く返せていませんでした。
個人的にあまり見ないタイプのエラーだったので少し焦りましたねw
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。