Pythonの型不一致エラー「can only concatenate〜」の対処方法についてまとめた記事です。
「can only concatenate」が発生するケースと対処方法について説明します。
「can only concatenate」(型不一致)とは?
「can only concatenate〜」は型不一致の場合に起きるエラーです。
プログラミングでは計算をする場合、計算に使う全ての値の型を揃える必要がありますが、一つでも違う型の値がある場合は「can only concatenate〜」となります。
型の使い方を理解していない初心者の頃はよく見るエラーです。
ちなみにイージーミスの多い私の場合は最近でもちょくちょく見ます(笑)。
「can only concatenate〜」が起きるのは以下のような場合です。
◆プログラム概要
現在時刻を以下のフォーマットで表示したい。
日時:〇〇
※”日時:”は文字列。〇〇には現在時刻が入ります。
import datetime # 現在時刻の取得 now = datetime.datetime.now() # 文字列変数の定義 label = '日時:' print(label + now)
◆実行結果
Traceback (most recent call last): File "", line 1, in TypeError: can only concatenate str (not "datetime.datetime") to str
上記例では、文字列とdatetime型の変数を加算しようとしたため型不一致のためエラーとなっています。
「can only concatenate」の対処方法
「can only concatenate〜」の対処方法は以下の通り。
・型を揃える
・キャストする
型を揃える
基本的に計算をする場合は型を揃えておくのがベストです。
キャストすると意図しない計算結果になる可能性が高くなります。
実装例は以下の通り。
now_strに文字列に変換した時刻を取得します。
import datetime # 現在時刻の取得 now = datetime.datetime.now() # 文字列型に変換 now_str = now.strftime('%Y/%m/%d %H:%M:%S') # 文字列変数の定義 label = '日時:' print(label + now_str)
◆実行結果
日時:2019/11/22 16:07:48
キャストする
キャストとは強制的に型を書き換える方法です。
例えば文字列型にキャストしたい場合は以下のように記述します。
now_str = str(now)
その他整数型に書き換えるint()などがあります。
強引に型を書き換える方法なので意図しない動きになるケースも多いです。
テストをしっかりと行ってエラーが起きないように注意しましょう。
時刻と文字列
時刻を文字列に寄せる場合の実装例は以下の通り。
import datetime # 現在時刻の取得 now = datetime.datetime.now() # 文字列変数の定義 label = '日時:' print(label + str(now))
◆実行結果
日時:2019-11-22 16:21:07.429220
キャストと計算
キャストによって数字の計算をしたい場合はint型に寄せる必要があります。
◆文字列に寄せる場合
a = 1 b = "2" print(str(a) + b)
◆実行結果
’12’
◆整数に寄せる場合
a = 1 b = "2" print(a + int(b))
◆実行結果
3
上記のように文字列(str型)に寄せると計算せずにそのままくっつき、整数(int型)に寄せると計算ができます。
ちなみに時刻型の計算をしたい場合は、timedeltaを使用します。
import datetime datetime.timedelta(hours=1) now = datetime.datetime.now() print(now + hour)
◆実行結果
2019-11-22 18:19:16.183098
datetime型の使い方については公式ドキュメントも熟読してください。
おすすめ記事Python入門者のための100日勉強方法
Pythonエラーの解決方法まとめ>>【初心者向け】Pythonのエラーを減らす方法・解決まとめ