(最終更新月:2021年11月)
✔当記事は下記のエラー発生でお困りの方へ向けて書かれています
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
こちらはPythonのデータ型に関するエラーです。
「整数型(int)と文字列(str)を + することはできません」
回避する方法としては、こちら。
- データ型を変更する
下記にて解説していきます。
【解決策】データ型の変換!
Pythonには、以下のようなメソッドがあります。
型名()
例えば、int型へ変更する場合は、int()メソッドを使います。
int("1") + 1
[OUTPUT]
2
int(文字列)
でint型へ変更できるのです。
intメソッドで、int型へ変更できるのは、数字の文字列だけ
仮に、“python”などの文字列にintメソッドを使うとエラーとなってしまいます
気をつけましょう!
文字列に変更したい場合は、str()メソッドを使います。
"1"+ str(1)
[OUTPUT]
"11"
str(整数型)
でstr型へ変更できましたね!
strメソッドでは、int型だけでなく、float型も文字列へ変更できます
>>> str(3.14) '3.14'
覚えておきましょう!
int()、str()以外のメソッド
全ての型でメソッドは用意されています
- float()
- bool()
- list()
- tuple()
- dict()
- datetime()
次章ではさまざまなケースでの具体例をご覧ください。
【具体例①】CSVファイル読み込み時のエラー
CSVファイルを読み込む際によく遭遇するエラーです。
# エラーが発生するコード
with open('sales.csv') as f:
for line in f:
total = int(line['amount']) + line['tax'] # TypeError!
# 正しいコード
with open('sales.csv') as f:
for line in f:
amount = int(line['amount'])
tax = int(line['tax'])
total = amount + tax
int()を使って、文字列を数値へ変換しよう。
【具体例②】WebAPIからのデータ処理
JSONデータを処理する際のよくあるケースです。
# エラーが発生するコード
response = requests.get('https://api.example.com/data')
data = response.json()
result = data['price'] + 100 # TypeError!
# 正しいコード
response = requests.get('https://api.example.com/data')
data = response.json()
result = float(data['price']) + 100
floatへ変換することで、エラーを回避しています。
【具体例③】フォーム入力の処理
Webフォームからの入力処理でよく見られるパターン。
# エラーが発生するコード
age = request.form['age']
next_year_age = age + 1 # TypeError!
# 正しいコード
age = int(request.form['age'])
next_year_age = age + 1
【具体例④】計算結果の文字列連結
計算結果を表示する際によくあるケースになります。
# エラーが発生するコード
price = 1000
tax_rate = 0.1
message = "合計金額: " + price * (1 + tax_rate) # TypeError!
# 正しいコード
price = 1000
tax_rate = 0.1
message = "合計金額: " + str(price * (1 + tax_rate))
このように、文字列に直すケースもあるでしょう。
便利なTips
さまざまなテクニックを駆使することで、こちらのエラーを回避しやすくなります。
f-stringの活用
文字列結合では、f-stringを使うとより読みやすく、エラーも防げます。
price = 1000
tax_rate = 0.1
message = f"合計金額: {price * (1 + tax_rate)}" # OK!
isinstance()による型チェック
データ型を事前に確認することで、エラーを防ぐことができます。
def process_number(value):
if not isinstance(value, (int, float)):
value = float(value)
return value * 1.1
try-exceptによる安全な型変換
エラーが発生する可能性がある場合は、try-exceptを使用します:
def safe_convert_to_int(value):
try:
return int(value)
except (ValueError, TypeError):
return 0 # デフォルト値を返す
よくある間違いと解決方法まとめ
よくある間違いを一覧にしてみると以下のとおり。
エラーパターン | 原因 | 解決方法 |
---|---|---|
"1" + 1 | 文字列と数値の加算 | int("1") + 1 または "1" + str(1) |
"100" * "2" | 文字列同士の乗算 | int("100") * int("2") |
price + "円" | 数値と文字列の結合 | str(price) + "円" または f”{price}円” |
data["count"] + 1 | 辞書の文字列値と数値の加算 | int(data["count"]) + 1 |
デバッグのベストプラクティス
うまく行かないときは、こちらを参考に、間違いがないかをチェックしよう。
- 型の確認
print(type(variable)) # 変数の型を確認
- デバッグ出力
print(f"変数の値: {variable}, 型: {type(variable)}")
- 段階的な型変換
# 複雑な計算の場合は段階的に変換
raw_value = "1000"
num_value = int(raw_value) # まず数値に変換
result = num_value * 1.1 # 計算実行
display = str(result) # 必要に応じて文字列に戻す