サイトアイコン ITC Media

【一発解決】PythonのTypeError解決方法

(最終更新月:2021年11月)

✔当記事は下記のエラー発生でお困りの方へ向けて書かれています

TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’

こちらはPythonのデータ型に関するエラーです。

整数型(int)と文字列(str)を + することはできません

回避する方法としては、こちら。

下記にて解説していきます。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

【解決策】データ型の変換!

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()以外のメソッド

全ての型でメソッドは用意されています

次章ではさまざまなケースでの具体例をご覧ください。

【具体例①】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

デバッグのベストプラクティス

うまく行かないときは、こちらを参考に、間違いがないかをチェックしよう。

  1. 型の確認
   print(type(variable))  # 変数の型を確認
  1. デバッグ出力
   print(f"変数の値: {variable}, 型: {type(variable)}")
  1. 段階的な型変換
   # 複雑な計算の場合は段階的に変換
   raw_value = "1000"
   num_value = int(raw_value)  # まず数値に変換
   result = num_value * 1.1    # 計算実行
   display = str(result)       # 必要に応じて文字列に戻す
モバイルバージョンを終了