في هذا الدرس من سلسلة مشكلة وحل على موقع بايثون العرب، سنتحدث عن خطأ شائع جدًا يظهر للمبتدئين عند محاولة دمج نص مع رقم في بايثون.
{getToc} $title={محتوى المقال}
رسالة الخطأ تكون غالبًا بهذا الشكل:
TypeError: can only concatenate str (not "int") to str
هذا الخطأ يظهر عندما تحاول استخدام علامة الجمع + لدمج نص من نوع str مع رقم من نوع int بدون تحويل الرقم إلى نص.
{alertInfo} هذا الخطأ لا يعني أن الرقم خطأ، بل يعني أنك تحاول دمج نوعين مختلفين بطريقة غير مناسبة.
إذا كنت ما زلت تتعلم أنواع البيانات، راجع هذا الدرس أولًا: أساسيات بايثون 7: أنواع البيانات في Python.
قصة المشكلة
تخيل أنك كتبت برنامجًا بسيطًا يعرض اسم المستخدم وعمره.
كتبت الكود بهذا الشكل:
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
أبسط حل هو تحويل الرقم إلى نص باستخدام الدالة 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؟
هي طريقة لكتابة النصوص مع المتغيرات بشكل مباشر.
نضع حرف 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} علامة + لا تعمل بنفس المعنى دائمًا؛ مع الأرقام تعني جمع، ومع النصوص تعني دمج.
أخطاء شائعة مرتبطة بهذا الخطأ
الخطأ الأول: نسيان 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.
مقالات مقترحة من بايثون العرب
- بايثون بالمثال 3: حساب عدد الكلمات في نص باستخدام Python
- أساسيات بايثون 11: شرح if و else في Python للمبتدئين
- أساسيات بايثون 12: شرح Loops في Python للمبتدئين
خلاصة الحل
خطأ:
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.




