مرحبًا بك في درس جديد من سلسلة مشكلة وحل على موقع بايثون العرب. في هذا الدرس سنشرح واحدًا من أكثر أخطاء Python ظهورًا للمبتدئين، وهو خطأ:
TypeError: can only concatenate str (not "int") to str
يظهر هذا الخطأ غالبًا عندما تحاول دمج نص مع رقم باستخدام علامة الجمع +. مثلًا تريد طباعة جملة تحتوي على العمر أو الدرجة أو عدد النقاط، فتكتب النص والرقم معًا بنفس الطريقة، لكن بايثون ترفض لأن نوع البيانات مختلف.
في هذا المقال سنفهم معنى الخطأ، وسبب ظهوره، ثم نحلّه بثلاث طرق سهلة: استخدام str()، أو استخدام الفاصلة داخل print()، أو استخدام f-string وهي الطريقة الأفضل غالبًا في كتابة كود واضح وحديث.
{getToc} $title={محتوى المقال}
{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: وهو نوع النصوص مثل"Ahmed"أو"Age".int: وهو نوع الأرقام الصحيحة مثل20أو100.
عندما تستخدم علامة الجمع + مع نصين، تفهم بايثون أنك تريد دمج النصوص:
first = "Hello"
second = "Python"
print(first + " " + second)
الناتج:
Hello Python
لكن عندما تستخدم + بين نص ورقم، لا تقوم بايثون بتحويل الرقم إلى نص تلقائيًا، لذلك يظهر الخطأ.
سبب ظهور الخطأ can only concatenate str not int to str
سبب الخطأ هو محاولة دمج قيمة من نوع str مع قيمة من نوع int باستخدام علامة الجمع +.
مثال خاطئ:
age = 20
print("Age: " + age)
في هذا المثال، "Age: " نص، أما age فهو رقم. وبايثون لا تعرف هل تريد جمعًا حسابيًا أم دمجًا نصيًا، لذلك توقف التنفيذ وتعرض رسالة الخطأ.
{alertError} لا تستخدم علامة + لدمج نص مع رقم مباشرة. يجب تحويل الرقم إلى نص أو استخدام طريقة عرض مناسبة.
الحل الأول: تحويل الرقم إلى نص باستخدام str
أبسط حل هو تحويل الرقم إلى نص باستخدام الدالة str(). بعد التحويل يصبح الرقم نصًا، ويمكن دمجه مع باقي النصوص بدون مشكلة.
age = 20
print("Age: " + str(age))
الناتج:
Age: 20
هنا قمنا بتحويل age من رقم صحيح int إلى نص str قبل الدمج.
شرح str في Python ببساطة
الدالة str() تستخدم لتحويل القيم إلى نصوص. ويمكن استخدامها مع الأرقام، القيم المنطقية، أو حتى نتائج العمليات الحسابية.
number = 100
print(type(number))
print(type(str(number)))
الناتج:
<class 'int'>
<class 'str'>
السطر الأول يوضح أن المتغير number رقمي، والسطر الثاني يوضح أن القيمة بعد استخدام 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
لاحظ أننا لم نستخدم str() ولم نستخدم علامة الجمع للدمج. فقط وضعنا حرف f قبل النص، ثم كتبنا المتغيرات داخل الأقواس المعقوفة {}.
ما هي f-string في Python؟
هي طريقة حديثة وسهلة لكتابة النصوص مع المتغيرات. نضع حرف f قبل النص، ثم نضع اسم المتغير داخل {}.
name = "Sara"
score = 95
print(f"Hello {name}, your score is {score}")
الناتج:
Hello Sara, your score is 95
هذه الطريقة مفيدة جدًا عندما تريد عرض جملة تحتوي على أكثر من متغير.
مقارنة بين طرق حل الخطأ
| الطريقة | مثال | متى تستخدمها؟ |
|---|---|---|
str() |
"Age: " + str(age) |
عندما تريد الاستمرار باستخدام علامة + في دمج النصوص. |
الفاصلة داخل print() |
print("Age:", age) |
للعرض السريع والبسيط، خاصة أثناء التدريب. |
f-string |
f"Age: {age}" |
الأفضل غالبًا في الكود المنظم والواضح. |
مثال عملي مع input
أحيانًا يظهر الخطأ عند استخدام input() مع int(). لنفهم ذلك بمثال.
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}")
وإذا ظهر لك خطأ عند تحويل إدخال المستخدم إلى رقم، فقد يكون الخطأ من نوع آخر، ويمكنك مراجعة: حل خطأ ValueError invalid literal for int في Python.
الفرق بين الجمع والدمج في بايثون
علامة + في بايثون لا تعمل بنفس المعنى دائمًا. معناها يتغير حسب نوع البيانات.
مع الأرقام تعني جمعًا حسابيًا:
print(10 + 5)
الناتج:
15
ومع النصوص تعني دمج النصوص:
print("Hello " + "Python")
الناتج:
Hello Python
أما مع نص ورقم، فلا تستطيع بايثون الدمج مباشرة:
print("Age: " + 20)
وهنا يظهر خطأ TypeError.
{alertWarning} تذكر: + مع الأرقام تعني جمع، ومع النصوص تعني دمج، لكن لا تستخدمها مباشرة بين نص ورقم.
كيف أعرف نوع المتغير؟
إذا لم تكن متأكدًا من نوع المتغير، يمكنك استخدام الدالة type().
age = 20
name = "Ahmed"
print(type(age))
print(type(name))
الناتج:
<class 'int'>
<class 'str'>
هذه الطريقة تساعدك على فهم سبب الخطأ بسرعة، خاصة عندما تتعامل مع متغيرات كثيرة.
أخطاء شائعة مرتبطة بهذا الخطأ
الخطأ الأول: نسيان 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().
الخطأ الثالث: استخدام + كثيرًا مع النصوص الطويلة
هذا الكود يعمل إذا استخدمت str()، لكنه ليس الأفضل من ناحية القراءة:
name = "Omar"
age = 22
print("Name: " + name + ", Age: " + str(age))
الأفضل:
name = "Omar"
age = 22
print(f"Name: {name}, Age: {age}")
أفضل حل: str أم print أم f-string؟
كل طريقة لها مكانها. إذا كنت تتعلم في البداية وتريد طباعة قيم بسرعة، فاستخدام الفاصلة داخل print() سهل جدًا.
print("Age:", age)
أما إذا كنت تريد كتابة كود واضح وقابل للتعديل، فالأفضل استخدام f-string.
print(f"Age: {age}")
{alertSuccess} أفضل اختيار في أغلب الحالات هو f-string لأنها واضحة، سهلة القراءة، وتتعامل مع النصوص والأرقام بطريقة مريحة.
جدول سريع: الخطأ والحل
| الكود | الحالة | النتيجة |
|---|---|---|
"Age: " + age |
خطأ | لأن age رقم وليس نصًا. |
"Age: " + str(age) |
صحيح | تم تحويل الرقم إلى نص قبل الدمج. |
print("Age:", age) |
صحيح | الفاصلة تجعل print تعرض القيم بدون دمج يدوي. |
f"Age: {age}" |
صحيح | طريقة واضحة وحديثة لكتابة النصوص مع المتغيرات. |
أسئلة شائعة حول الخطأ
لماذا لا تحوّل بايثون الرقم إلى نص تلقائيًا؟
لأن بايثون تتعامل مع الأنواع بوضوح. عندما تستخدم + يجب أن يكون المعنى واضحًا: جمع أرقام أو دمج نصوص. لذلك لا تدمج نصًا ورقمًا تلقائيًا حتى لا يحدث سلوك غير متوقع.
هل الخطأ يظهر فقط مع int؟
لا. قد يظهر الخطأ أيضًا مع أنواع أخرى إذا حاولت دمجها مع نص باستخدام +، مثل float أو list بدون تحويل مناسب.
هل str تغير قيمة المتغير الأصلية؟
لا. استخدام str(age) يرجع نسخة نصية من القيمة، لكنه لا يغير المتغير الأصلي إلا إذا خزّنت النتيجة في نفس المتغير.
هل f-string تعمل مع الأرقام؟
نعم. يمكن استخدام f-string مع النصوص والأرقام والقيم المنطقية ونتائج العمليات الحسابية.
ما أفضل طريقة للمبتدئين؟
للتجارب السريعة استخدم الفاصلة داخل print(). أما للكود المرتب والمقالات التعليمية والمشاريع، فاستخدم f-string.
روابط مفيدة
- أساسيات بايثون 7: أنواع البيانات في Python
- حل خطأ ValueError invalid literal for int في Python
- فن قراءة رسائل الخطأ في بايثون للمبتدئين
- بايثون بالمثال 3: حساب عدد الكلمات في نص باستخدام Python
- محرر بايثون العرب لتجربة الأكواد أونلاين
- توثيق Python الرسمي حول النصوص str
خلاصة الحل
خطأ:
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}")
{alertSuccess} الخلاصة السريعة: عند عرض نص مع رقم في بايثون، استخدم str() أو الفاصلة داخل print أو f-string، ولا تدمج النص والرقم مباشرة بعلامة +.
تمرين بسيط لك
صحح الكود التالي بثلاث طرق مختلفة:
name = "Ali"
points = 50
print("Student " + name + " has " + points + " points")
حاول حله باستخدام:
str()- الفاصلة داخل
print() f-string