見出し画像

エンジニア日記:Python リスト型のKeyError対策

やりたかったこと

リクエストパラメータとして与えられるとある値のバリテーションチェックを行いたい。(リスト型に入っているとある値が正しく入力されているかのチェック)
補足)AWS Lambdaを使用し、Pythonでコードを書いています。

修正前コード

if type(request['name']) is str:
  print('OK!')
else:
  print('エラー:文字列を入力してください。') 

処理実行時にリクエストパラメータとして以下が入力されている想定でコードが書かれています。
{
 'name' : '名前',
 'tel' : 00000000000,
 'email' : 'xxx@xx.xx.xx'
}
今回はname(名前)が文字列かどうかをチェックしています。
※実際はもっと複雑な処理でしたが、例として簡単に書いています。

エラー内容・原因

[ERROR] KeyError: 'name' Traceback (most recent call last):
こちらはリストrequestに'name'というKeyがないよというエラーです。
リクエストパラメータとして上記を想定していましたが、
このエラー発生時は以下の通りパラメータが送信されていました。
{
 'tel' : 00000000000,
 'email' : 'xxx@xx.xx.xx'
}
nameが未入力(name : ’’)というわけではなく、
nameそのものがない状態でした。

対応

修正後コード

if 'name' in request and type(request['name']) is str:
  print('OK!')
else:
  print('エラー:文字列を入力してください。') 

要素 in リストで最初にnameが存在するかのチェックを追加しました。
nameがなければ、Falseが返され、以降の「type(request['name']) is str」の判定は行われないため、エラーは発生しません。

まとめ

とても基本的な対応になりますが、地味に現場でErrorが多発していたので、
今後の開発の注意事項として記載しました。
リストの要素に対して何らかの判定をする場合は、まず要素そのものが存在するのかを先にチェックするというのをセットで覚えておきたいです。
あと、クライアントの中で、その要素がなかった場合の処理をどうするのかまで要件が固まっていなかったりするので、ブランクを入れるようにすればいいのか、何らかのエラーを出すようにした方がいいのか確認も必要です。

この記事が気に入ったらサポートをしてみませんか?