【Python】TypeError: not supported between instancesの原因と解決方法
2020.05.03 /
PythonやDjangoでプログラムを組んでいると予期しないエラーが発生することが多々あります。
そのエラーの1つ、not supported between instancesの原因や解決方法について詳しく解説いたします。
エラー内容
TypeError: '<=' not supported between instances of 'str' and 'datetime.datetime'
*上記エラーコードはプログラム内容によりinstances of 以下が変わります。
TypeErrorのエラー原因
私の場合、エラー原因は比べる変数オブジェクトの型が異なっていることでした。
変数などのオブジェクトにはstring型(文字)やint型(数値)のような型が存在します。
基本的に変数同士の大小を比べる場合は変数の型は一致している必要があります。
ではどうのように解決するのかを見ていきましょう。
解決方法
上記のエラー内容を見ると、str型とdatetime.datetime型でタイプが違います、と表しているのがわかります。
下記リンクにあるOUTLOOKアプリを作成する場合も同様のエラーが表示される可能性があります。
【Python】OUTLOOKの添付ファイルを指定フォルダに自動保存するアプリ開発
例えば上記リンクのプログラムの場合、指定された開始日時と終了日時の間に受信したメールをif判定で絞り込んでいます。
if startdate <= period <= enddate:
このとき受信したメールの日時periodはdatetime.datetime()を使用しているためdatetime.datetime型。
一方手動入力された日時をgetメソッドで取得してそのまま使った場合string型になるので、
このまま二つを比べると今回紹介しているエラーと同様のエラーが表示されることでしょう。
それを避けるためにOUTLOOKアプリではgetメソッドで取得した文字列を以下のようにして、datetime.datetime型に変換しています。
startdate = datetime.datetime.strptime(entry_start.get(), '%Y/%m/%d')
enddate = datetime.datetime.strptime(entry_end.get(), '%Y/%m/%d')
結論として、TypeErrorが発生したら変数の型を同じにする必要があるということです。
まとめ
今回のポイントは以下になります。
変数の比較等をする場合は必ず同じ型である必要がある
TypeErrorが発生したら、まずは変数の型違いを疑う
プログラムを作成するときは、変数の型も意識しながら作るようにしましょう。