システム開発を進めていて、extendを使おうとした際にハマったことをメモ書きとして残しておきます。
まぁ、正直書くほどでもないかもしれませんが、自分の備忘録も兼ねて……
ハマったきっかけ
そもそも今回の記事を書くことになったきっかけですが、とあるサービスのAPIを色々叩く必要があったので、楽をするためにモジュールを作っていました。
APIの種類によっては連続で叩いてレスポンスをリストにまとめて出力するようにしていたのですが、その際にextendを使っていたものの、結果を見るとなぜかkeyだけのListになっているAPIがありました…….
本当はDict型のレスポンスが返ってきます。
最初はレスポンスをjsonに変換しようとした時に何か問題があると思ったのですが、特に変化はなく……
じゃあappendだったらどうなるか検証してみたところ、正常にDictを維持していました。
何でだろうなぁ~おかしいなぁ~と悩んで一週間。
原因が判明しました。

元々APIで返ってくるレスポンスがものによってDictとListで変わっているやないかーい!
きっかけになった問題の原因
ひとまず根本的な原因はAPIを叩いた際に返ってくるレスポンスがAPIによってDictかListになっていて、Dictで返ってくるものだけがextendを使うとkeyだけのListになっていました。
そこで、ちょこっと検証しました。
とりあえず検証用に諸々の変数を定義します。
newList = []
dictList = []
dicts = {}
list1 = ['value1', 'value2', 'value3']
list2 = ['value01', 'value02', 'value03']
dict1 = {'key01': 1, 'key02': 2, 'key03': 3}
dict2 = {'key04': 4, 'key05': 5, 'key06': 6}
まず最初にextendは下記のように2つのListを1つに統合したい時に使用します。
newList.extend(list1)
newList.extend(list2)
print(newList)
['value1', 'value2', 'value3', 'value01', 'value02', 'value03']
ちなみにappendだとListへ追加しますが、追加したいデータの形式ごと追加してしまいます。
newList.append(list1)
newList.append(list2)
print(newList)
# list1、list2の形式であるListをそのままnewListへ追加している
[['value1', 'value2', 'value3'], ['value01', 'value02', 'value03']]
extendは2つのListを1つに統合する時に使用しますが、これがDictで使用するとどうなるでしょうか。
newList.extend(dict1)
newList.extend(dict2)
print(newList)
# keyだけがnewListに格納される
['key01', 'key02', 'key03', 'key04', 'key05', 'key06']
今回問題になったkeyだけのListになりましたね。
よくよく見るとfor文を使う場合と同じような光景ですね……
for d in dict1:
print(d)
'key01'
'key02'
'key03'

ということは、extendは内部でfor文が回っている……?
まとめ
結局、今回のきっかけとなった問題はappendで処理をしたので解決したのですが、まじまじとextendを見つめたことがなかったので、かなり勉強になりました!
いや~、それにしても超基本的な話だったとは思いますが、意外と気づけないものですね(笑)
コメント