サイトアイコン Amelt.net

pyhon:appendでKeyError,extendでTypeError: ‘NoneType’ object is not iterableの対策

Amelt

Amelt

This post is also available in: English-US (英語)

pyhonでのエラー TypeError: 'NoneType' object is not iterable に関してのメモです。
JSON形式のデータをjsonモジュール(import json)を使って辞書オブジェクト(連想配列)にして加工する時に、このエラーによく出会います。

pyhonで辞書オブジェクト(連想配列)をappendする際に、辞書に存在しないキーでアクセスすると KeyError: とエラーが出ます。
その際には get() を使うとエラーが出なくなります。

サンプルデータ(data)と、サンプルリスト(datalistA,datalistB)です。

data = {
	"menuitem": [
		{"value": ["New", "Open"]},
		{"value": ["Create", "Read"]},
		{"input": ["AAA", "BBB"]}
	]
}

datalistA = []
datalistB = []
for i in data['menuitem']:
		# datalistB.append(i['value']) # KeyError: 'value'
		datalistA.append(i.get('value')) # [['New', 'Open'], ['Create', 'Read'], None]

appendでリストが入れ子(多重リスト)になると困る時には extend を使いますが、get() を使うと辞書に存在しないキーは None で返ってきます。

それが原因でエラー TypeError: 'NoneType' object is not iterable が発生します。
なので、 try-except-else 文とかを使って回避します。 except-else の部分でなにもしたくない場合には単純に pass と書いておきます。

#data の内容はappendの例と同じ
for i in data['menuitem']:
	try:
		datalistB.extend(i.get('value')) # ['New', 'Open', 'Create', 'Read']
	except TypeError:
		print "Someting" # try-except-else文がない場合 TypeError: 'NoneType' object is not iterable
	else:
		pass

流行のPythonやRubyについて学びたいという方は 世界最大級のオンライン学習サイトUdemy をおすすめします。

No tags for this post.