مشكلة وحل #7: حل خطأ TypeError can only concatenate str not int to str في Python


مشكلة وحل 7: شرح خطأ TypeError can only concatenate str not int to str في بايثون عند دمج نص مع رقم

في هذا الدرس من سلسلة مشكلة وحل على موقع بايثون العرب، سنتحدث عن خطأ شائع جدًا يظهر للمبتدئين عند محاولة دمج نص مع رقم في بايثون.

{getToc} $title={محتوى المقال}

رسالة الخطأ تكون غالبًا بهذا الشكل:

TypeError: can only concatenate str (not "int") to str

هذا الخطأ يظهر عندما تحاول استخدام علامة الجمع + لدمج نص من نوع str مع رقم من نوع int بدون تحويل الرقم إلى نص.

{alertInfo} هذا الخطأ لا يعني أن الرقم خطأ، بل يعني أنك تحاول دمج نوعين مختلفين بطريقة غير مناسبة.

إذا كنت ما زلت تتعلم أنواع البيانات، راجع هذا الدرس أولًا: أساسيات بايثون 7: أنواع البيانات في Python.

محاولة دمج النص Age مع الرقم 20 في Python وظهور خطأ TypeError بسبب اختلاف نوع البيانات

قصة المشكلة

تخيل أنك كتبت برنامجًا بسيطًا يعرض اسم المستخدم وعمره.

كتبت الكود بهذا الشكل:

name = "Ahmed"
age = 20

print("My name is " + name)
print("My age is " + age)

السطر الأول يعمل بشكل طبيعي، لأنك دمجت نصًا مع نص.

لكن السطر الثاني يسبب خطأ، لأنك حاولت دمج نص مع رقم.

رسالة الخطأ:

TypeError: can only concatenate str (not "int") to str

ما معنى TypeError في Python؟

خطأ TypeError يعني أنك استخدمت نوع بيانات بطريقة غير مناسبة.

في بايثون، النصوص نوعها:

str

والأرقام الصحيحة نوعها:

int

وعند استخدام علامة الجمع +، يجب أن يكون الاستخدام واضحًا.

إذا كان الطرفان نصوصًا، فبايثون تفهم أنك تريد دمج النصوص:

first = "Hello"
second = "Python"

print(first + " " + second)

الناتج:

Hello Python

لكن إذا كان أحد الأطراف رقمًا، يجب تحويله أو استخدام طريقة عرض مناسبة.

سبب ظهور الخطأ

سبب الخطأ هو محاولة دمج str مع int باستخدام +.

مثال خاطئ:

age = 20

print("Age: " + age)

بايثون هنا تسأل: هل تريد جمع أرقام؟ أم دمج نصوص؟

لذلك تظهر رسالة الخطأ.

{alertError} لا تستخدم + لدمج نص مع رقم مباشرة، لأن هذا يسبب TypeError في Python.

 

استخدام دالة str في Python لتحويل الرقم إلى نص قبل دمجه مع عبارة Age

الحل الأول: تحويل الرقم إلى نص باستخدام str

أبسط حل هو تحويل الرقم إلى نص باستخدام الدالة str().

الكود الصحيح:

age = 20

print("Age: " + str(age))

الناتج:

Age: 20

هنا حوّلنا age من رقم إلى نص قبل الدمج.

شرح str ببساطة

الدالة str() تحول القيمة إلى نص.

مثال:

number = 100

print(type(number))
print(type(str(number)))

الناتج:

<class 'int'>
<class 'str'>

بعد استخدام str() أصبح الرقم نصًا، ويمكن دمجه مع النصوص.

الحل الثاني: استخدام الفاصلة داخل print

يمكنك أيضًا استخدام الفاصلة داخل print() بدل علامة الجمع.

age = 20

print("Age:", age)

الناتج:

Age: 20

هذه الطريقة سهلة جدًا للمبتدئين، لأن print() تتعامل مع أكثر من قيمة وتفصل بينها بمسافة تلقائيًا.

{alertSuccess} للمبتدئين، استخدام الفاصلة داخل print أسهل من استخدام + عند عرض نص مع رقم.

الحل الثالث: استخدام f-string

الطريقة الأفضل والأكثر احترافية في بايثون هي استخدام f-string.

مثال:

name = "Ahmed"
age = 20

print(f"My name is {name} and my age is {age}")

الناتج:

My name is Ahmed and my age is 20

هذه الطريقة ممتازة لأنها تجعل الكود أوضح وأسهل قراءة.

استخدام f-string في Python لعرض الاسم والعمر داخل نص واحد بدون خطأ TypeError

ما هي f-string في Python؟

هي طريقة لكتابة النصوص مع المتغيرات بشكل مباشر.

نضع حرف f قبل النص، ثم نضع المتغيرات داخل أقواس معقوفة:

name = "Sara"

print(f"Hello {name}")

الناتج:

Hello Sara

ويمكن استخدامها مع الأرقام بدون مشكلة:

score = 95

print(f"Your score is {score}")

الناتج:

Your score is 95

مقارنة بين الطرق الثلاث

الطريقة مثال متى تستخدمها؟
str() "Age: " + str(age) عندما تريد دمج النصوص باستخدام +.
الفاصلة داخل print() print("Age:", age) للعرض السريع والبسيط.
f-string f"Age: {age}" الأفضل غالبًا للكود الواضح والمنظم.

مثال عملي مع input

أحيانًا يظهر هذا الخطأ أثناء التعامل مع إدخال المستخدم.

مثال:

age = int(input("Enter your age: "))

print("Your age is " + age)

هنا age أصبح رقمًا بسبب int()، لذلك لا يمكن دمجه مباشرة مع النص.

الحل باستخدام str():

age = int(input("Enter your age: "))

print("Your age is " + str(age))

والحل الأفضل باستخدام f-string:

age = int(input("Enter your age: "))

print(f"Your age is {age}")

لو ظهرت لك مشكلة مع int(input())، يمكنك مراجعة: مشكلة وحل: حل خطأ ValueError invalid literal for int في Python.

الفرق بين الجمع والدمج

علامة + في بايثون لها أكثر من استخدام حسب نوع البيانات.

مع الأرقام تعني جمع:

print(10 + 5)

الناتج:

15

ومع النصوص تعني دمج:

print("Hello " + "Python")

الناتج:

Hello Python

لكن مع نص ورقم لا تعرف بايثون كيف تتعامل تلقائيًا:

print("Age: " + 20)

وهنا يظهر الخطأ.

{alertWarning} علامة + لا تعمل بنفس المعنى دائمًا؛ مع الأرقام تعني جمع، ومع النصوص تعني دمج.

ملخص أخطاء دمج النصوص مع الأرقام في Python وحلولها باستخدام str و print comma و f-string

أخطاء شائعة مرتبطة بهذا الخطأ

الخطأ الأول: نسيان str

هذا خطأ:

score = 90

print("Score: " + score)

الصحيح:

score = 90

print("Score: " + str(score))

الخطأ الثاني: استخدام int عندما لا تحتاجه

إذا كنت تريد فقط عرض قيمة المستخدم كنص، لا تحتاج إلى تحويلها إلى int.

age = input("Enter your age: ")

print("Your age is " + age)

هنا input() ترجع نصًا، لذلك الدمج يعمل.

لكن إذا أردت إجراء عملية حسابية على العمر، وقتها تحتاج إلى int().

الخطأ الثالث: استخدام + كثيرًا مع النصوص الطويلة

هذا الكود يعمل بعد التحويل، لكنه ليس الأفضل من ناحية القراءة:

name = "Omar"
age = 22

print("Name: " + name + ", Age: " + str(age))

الأفضل:

name = "Omar"
age = 22

print(f"Name: {name}, Age: {age}")

أفضل حل نستخدمه؟

إذا كنت مبتدئًا وتريد طباعة نص مع رقم بسرعة، استخدم الفاصلة داخل print().

print("Age:", age)

أما إذا كنت تريد كودًا مرتبًا وواضحًا، فاستخدم f-string.

print(f"Age: {age}")
{alertSuccess} أفضل اختيار في أغلب الحالات هو f-string لأنها واضحة، سهلة، وتتعامل مع النصوص والأرقام بطريقة مريحة.

روابط مفيدة

لفهم أنواع البيانات، اقرأ: أساسيات بايثون 7: أنواع البيانات في Python.

ولفهم التعامل مع الإدخال وتحويله إلى رقم، اقرأ: مشكلة وحل: حل خطأ ValueError invalid literal for int في Python.

ولفهم طريقة قراءة الأخطاء عمومًا، اقرأ: فن قراءة رسائل الخطأ في بايثون للمبتدئين.

ويمكنك الرجوع إلى توثيق بايثون الرسمي حول النصوص: Python str Documentation.

مقالات مقترحة من بايثون العرب

خلاصة الحل

خطأ:

TypeError: can only concatenate str (not "int") to str

يظهر عندما تحاول دمج نص مع رقم باستخدام +.

مثال خاطئ:

age = 20

print("Age: " + age)

الحل باستخدام str():

print("Age: " + str(age))

والحل الأفضل باستخدام f-string:

print(f"Age: {age}")

تذكر دائمًا: عند دمج النصوص مع الأرقام، استخدم str() أو f-string أو الفاصلة داخل print().

تمرين بسيط لك

صحح الكود التالي:

name = "Ali"
points = 50

print("Student " + name + " has " + points + " points")

جرّب حله بثلاث طرق:

  • باستخدام str().
  • باستخدام الفاصلة داخل print().
  • باستخدام f-string.



إرسال تعليق

أحدث أقدم