رفع خطاهای پایتون

خطای TypeError در پایتون؛ can only concatenate str و unsupported operand

خطای TypeError در پایتون؛ can only concatenate str و unsupported operand

🗓 آخرین به‌روزرسانی:

TypeError زمانی رخ می‌دهد که عملیاتی را روی داده‌ای انجام دهید که برای آن نوع داده تعریف نشده است. معروف‌ترین نمونه‌اش جمع کردن یک رشته با یک عدد است: "سن: " + 20. پایتون برخلاف برخی زبان‌ها، نوع داده‌ها را به‌صورت خودکار به هم تبدیل نمی‌کند و از شما می‌خواهد صریح باشید.

معنی خطای TypeError در پایتون

هر مقدار در پایتون یک نوع (Type) دارد: int، str، list، None و غیره. هر عملگر و تابع فقط با نوع‌های مشخصی کار می‌کند. TypeError یعنی نوع داده ورودی با چیزی که عملگر یا تابع انتظار دارد سازگار نیست؛ مثلاً جمع str با int، صدا زدن چیزی که تابع نیست، یا دادن تعداد آرگومان اشتباه به یک تابع.

علت‌های رایج این خطا

  • جمع یا چسباندن رشته با عدد بدون تبدیل نوع.
  • کار با خروجی input() که همیشه رشته است، به‌عنوان عدد.
  • صدا زدن تابع با تعداد آرگومان کمتر یا بیشتر از تعریف.
  • انجام عملیات روی None (مثلاً خروجی تابعی که return ندارد).
  • صدا زدن چیزی که تابع نیست؛ مثل x() وقتی x یک عدد است.

کد غلط و کد درست (با خروجی واقعی)

همه نمونه‌کدهای زیر با پایتون 3.13.5 اجرا شده‌اند و خروجی‌ها همان چیزی است که پایتون واقعاً نمایش می‌دهد.

مثال 1: جمع رشته و عدد

❌ کد غلط:

age = 20
print("My age: " + age)

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 2, in <module>
    print("My age: " + age)
          ~~~~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str

✅ کد درست:

age = 20
print("My age: " + str(age))
print(f"My age: {age}")

خروجی:

My age: 20
My age: 20

مثال 2: خروجی input رشته است

❌ کد غلط:

a = "10"  # values from input() are strings
b = 5
print(a + b)

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 3, in <module>
    print(a + b)
          ~~^~~
TypeError: can only concatenate str (not "int") to str

✅ کد درست:

a = "10"
b = 5
print(int(a) + b)

خروجی:

15

مثال 3: تعداد آرگومان اشتباه

❌ کد غلط:

def greet(name, city):
    print(f"Hello {name} from {city}")

greet("Sara")

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 4, in <module>
    greet("Sara")
    ~~~~~^^^^^^^^
TypeError: greet() missing 1 required positional argument: 'city'

✅ کد درست:

def greet(name, city="Tehran"):
    print(f"Hello {name} from {city}")

greet("Sara")

خروجی:

Hello Sara from Tehran

راه‌حل قدم‌به‌قدم

  1. آخرین خط پیام را بخوانید؛ پایتون دقیقاً می‌گوید کدام نوع‌ها با هم ناسازگار بوده‌اند (مثلاً str و int).
  2. با print(type(x)) نوع واقعی متغیرهای آن خط را بررسی کنید.
  3. در صورت نیاز با int()، float() یا str() نوع را صریحاً تبدیل کنید یا از f-string استفاده کنید.
  4. اگر خطا درباره آرگومان‌هاست، تعریف تابع را با نحوه صدا زدنش مقایسه کنید.
  5. اگر یکی از مقادیر None است، بررسی کنید تابع مربوط مقدار را با return برمی‌گرداند یا نه.

خواندن پیام TypeError و عیب‌یابی

TypeError یعنی عملیاتی را روی نوع داده‌ای انجام داده‌اید که از آن پشتیبانی نمی‌کند؛ مثلاً جمع عدد با رشته، صدا زدن چیزی که تابع نیست یا دادن تعداد آرگومان اشتباه به تابع. پیام خطا معمولاً نوع‌های درگیر را نام می‌برد، مثل unsupported operand type(s) for +: 'int' and 'str'.

برای رفع، نوع هر دو طرف عملیات را با type بررسی کنید. ورودی تابع input همیشه رشته است و این علت اصلی بیشتر TypeError های مبتدیان است. در خطاهای مربوط به آرگومان، پیام دقیقاً می‌گوید تابع چند آرگومان انتظار داشته و چند تا دریافت کرده است.

سه نوع رایج TypeError

cases = [
    ("add", lambda: 5 + "5"),
    ("call", lambda: (42)()),
    ("args", lambda: len(1, 2)),
]

for label, func in cases:
    try:
        func()
    except TypeError as error:
        print(label, "->", error)

age = "20"
print("Next year:", int(age) + 1)
print("Text:", "Age: " + str(int(age) + 1))

خروجی (اجراشده با Python 3.13):

add -> unsupported operand type(s) for +: 'int' and 'str'
call -> 'int' object is not callable
args -> len() takes exactly one argument (2 given)
Next year: 21
Text: Age: 21

قدم‌به‌قدم رفع TypeError

پیام TypeError معمولاً نوع‌های درگیر را نام می‌برد؛ آن‌ها را با انتظار خود مقایسه کنید.

  1. دسته پیام را تشخیص دهید: unsupported operand، not callable، missing argument یا can only concatenate هرکدام علت متفاوتی دارند.
  2. نوع عملوندها را چاپ کنید: print(type(a), type(b)) را قبل از خط خطا بگذارید.
  3. ورودی‌ها را بررسی کنید: مقادیر input، فایل و فرم همیشه رشته‌اند؛ تبدیل را در همان نقطه دریافت انجام دهید.
  4. پوشاندن نام‌های داخلی را چک کنید: اگر str، list یا sum را قبلاً متغیر کرده‌اید، not callable می‌گیرید.
  5. امضای تابع را ببینید: با help(func) تعداد و نام آرگومان‌ها را با فراخوانی خود مقایسه کنید.

اگر پیام خطا از داخل کتابخانه آمده، خط آخرِ کد خودتان در traceback را پیدا کنید. آن خط معمولاً جایی است که داده با نوع اشتباه به کتابخانه داده‌اید؛ مستندات تابع را برای نوع ورودی بررسی کنید.

چک‌لیست پیشگیری

  • ورودی input را قبل از محاسبه با int یا float تبدیل کنید.
  • برای ترکیب متن و عدد از f-string استفاده کنید تا تبدیل خودکار انجام شود.
  • نام متغیرها را هم‌نام توابع داخلی مثل str، list یا sum نگذارید.
  • با type hint و mypy خطاهای نوع را پیش از اجرا پیدا کنید.
  • در متدهای کلاس self را فراموش نکنید؛ این علت رایج خطای تعداد آرگومان است.

📌 همچنین بخوانید: خطای unexpected EOF while parsing در پایتون، خطای ‘int’ object is not subscriptable در پایتون و خطای ImportError

سؤالات متداول

بهترین راه چسباندن متن و عدد چیست؟

استفاده از f-string مثل f"سن: {age}" خواناتر و امن‌تر است و نیازی به تبدیل دستی ندارد.

چرا int(“3.5”) خطا می‌دهد؟

آن خطا ValueError است نه TypeError؛ چون نوع ورودی (رشته) درست است ولی مقدارش عدد صحیح معتبر نیست. ابتدا float() و سپس int() را به کار ببرید.

NoneType در پیام TypeError یعنی چه؟

یعنی یکی از مقادیر None است. معمولاً تابعی که انتظار داشتید مقدار برگرداند، return نداشته یا متدی مثل list.sort() را که خروجی ندارد در متغیر ریخته‌اید.

str object is not callable یعنی چه؟

معمولاً یعنی متغیری به نام str ساخته‌اید و تابع داخلی را پوشانده‌اید؛ نام متغیر را عوض کنید و مفسر را دوباره اجرا کنید.

missing 1 required positional argument از کجا می‌آید؟

یا آرگومانی را در فراخوانی جا انداخته‌اید یا متد را روی کلاس به جای نمونه صدا زده‌اید.

can only concatenate str (not int) to str چطور رفع می‌شود؟

عدد را با str تبدیل کنید یا بهتر از f-string مثل f'Total: {n}' استفاده کنید.

آموزش‌های مرتبط

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *