في هذا الدرس من سلسلة مشكلة وحل على موقع بايثون العرب، سنتحدث عن خطأ مشهور جدًا يظهر للمبتدئين عند استخدام input() مع int() في بايثون.
{getToc} $title={محتوى المقال}
الخطأ هو:
ValueError: invalid literal for int() with base 10
هذا الخطأ يظهر عندما تحاول تحويل قيمة إلى رقم صحيح باستخدام int()، لكن القيمة التي أدخلتها ليست رقمًا صحيحًا صالحًا.
هذا المقال مهم جدًا لأنه مرتبط بأمثلة كثيرة للمبتدئين، مثل برنامج معرفة هل الرقم زوجي أم فردي، وبرامج الآلة الحاسبة، وبرامج إدخال العمر أو السعر أو عدد العناصر.
إذا لم تكن تعرف طريقة استخدام input() و int()، يمكنك قراءة:
بايثون بالمثال 2: معرفة هل الرقم زوجي أم فردي في Python.
قصة المشكلة
وصلتنا مشكلة من أحد متابعي بايثون العرب يقول فيها:
"كنت أكتب برنامجًا بسيطًا يطلب من المستخدم إدخال رقم، ثم يحول الإدخال إلى عدد صحيح باستخدام int(). عندما أدخلت رقمًا يعمل البرنامج، لكن عندما كتبت كلمة بدل الرقم ظهر لي خطأ طويل اسمه ValueError."
الكود كان بهذا الشكل:
age = int(input("أدخل عمرك: "))
print("عمرك هو:", age)
إذا كتب المستخدم:
25
سيعمل البرنامج بدون مشكلة.
لكن إذا كتب:
hello
سيظهر الخطأ:
ValueError: invalid literal for int() with base 10: 'hello'
ما معنى ValueError في Python؟
خطأ ValueError يعني أن نوع العملية صحيح، لكن القيمة التي أرسلتها غير مناسبة.
مثلاً، الدالة int() وظيفتها تحويل قيمة إلى عدد صحيح.
هذا صحيح:
int("10")
لأن النص "10" يمكن تحويله إلى رقم.
لكن هذا غير صحيح:
int("hello")
لأن كلمة hello ليست رقمًا، لذلك تظهر رسالة الخطأ.
سبب ظهور خطأ invalid literal for int
سبب الخطأ ببساطة هو أنك تحاول تحويل قيمة غير رقمية إلى عدد صحيح.
أمثلة تسبب الخطأ:
int("abc")
int("12.5")
int("")
int("10 years")
كل هذه القيم لا يمكن تحويلها مباشرة إلى عدد صحيح باستخدام int().
مثال بسيط يسبب الخطأ
لنكتب مثالًا مباشرًا:
number = int("Python")
print(number)
هذا الكود سيعطي خطأ، لأن Python ليست رقمًا.
أما هذا الكود صحيح:
number = int("50")
print(number)
الناتج:
50
لماذا يحدث الخطأ مع input؟
الدالة input() في بايثون ترجع القيمة كنص دائمًا.
حتى لو كتب المستخدم رقمًا، فإن بايثون تتعامل معه كنص.
مثال:
number = input("أدخل رقمًا: ")
print(type(number))
إذا أدخل المستخدم 10، سيكون النوع:
<class 'str'>
لذلك نستخدم int() لتحويل النص إلى رقم.
number = int(input("أدخل رقمًا: "))
لكن إذا أدخل المستخدم نصًا بدل رقم، تظهر المشكلة.
الحل الأول: تأكد أن المستخدم يدخل رقمًا صحيحًا
أبسط حل هو أن تطلب من المستخدم إدخال رقم صحيح فقط.
age = int(input("أدخل عمرك بالأرقام فقط: "))
print("عمرك هو:", age)
لكن هذا الحل لا يمنع الخطأ إذا كتب المستخدم قيمة خاطئة، لذلك نحتاج إلى حل أفضل.
الحل الثاني: استخدام try except
أفضل طريقة للتعامل مع هذا الخطأ هي استخدام try except.
try:
age = int(input("أدخل عمرك: "))
print("عمرك هو:", age)
except ValueError:
print("خطأ: الرجاء إدخال رقم صحيح فقط")
بهذا الشكل، إذا كتب المستخدم نصًا بدل رقم، لن يتوقف البرنامج فجأة، بل سيعرض رسالة مفهومة.
شرح try except ببساطة
الكود داخل try هو الكود الذي قد يسبب خطأ.
try:
age = int(input("أدخل عمرك: "))
إذا حدث خطأ من نوع ValueError، ينتقل البرنامج إلى:
except ValueError:
print("خطأ: الرجاء إدخال رقم صحيح فقط")
هذه طريقة جيدة لجعل البرنامج يتعامل مع أخطاء المستخدم بطريقة لطيفة.
الحل الثالث: استخدام isdigit قبل int
يمكنك استخدام isdigit() للتحقق هل النص يحتوي على أرقام فقط.
user_input = input("أدخل رقمًا: ")
if user_input.isdigit():
number = int(user_input)
print("الرقم هو:", number)
else:
print("الرجاء إدخال رقم صحيح فقط")
هذه الطريقة مفيدة مع الأرقام الصحيحة الموجبة، لكنها ليست مثالية في كل الحالات.
ملاحظة مهمة عن isdigit
الدالة isdigit() لا تتعامل جيدًا مع الأرقام السالبة مثل:
-5
لأن علامة السالب ليست رقمًا.
لذلك في كثير من البرامج يكون try except أفضل وأشمل.
ماذا لو كان الرقم عشريًا؟
إذا أدخل المستخدم رقمًا عشريًا مثل:
12.5
فإن int("12.5") يسبب خطأ.
للتعامل مع الأرقام العشرية، استخدم float() بدل int().
try:
price = float(input("أدخل السعر: "))
print("السعر هو:", price)
except ValueError:
print("الرجاء إدخال رقم صحيح أو عشري")
استخدم int() للأعداد الصحيحة، واستخدم float() للأعداد العشرية.
مثال عملي: برنامج معرفة الزوجي والفردي بطريقة آمنة
في مقال بايثون بالمثال 2 تعلمنا معرفة هل الرقم زوجي أم فردي.
الآن سنكتب نسخة آمنة تتعامل مع الإدخال الخاطئ.
try:
number = int(input("أدخل رقمًا: "))
if number % 2 == 0:
print("الرقم زوجي")
else:
print("الرقم فردي")
except ValueError:
print("خطأ: الرجاء إدخال رقم صحيح")
هذه نسخة أفضل من الكود البسيط، لأنها لا تتوقف إذا أدخل المستخدم نصًا.
خطأ شائع: تحويل قيمة فارغة إلى int
إذا ضغط المستخدم Enter بدون كتابة شيء، تكون القيمة فارغة:
""
وهذا يسبب نفس الخطأ عند استخدام int().
مثال:
number = int("")
لذلك من الأفضل دائمًا التعامل مع إدخال المستخدم بحذر.
خطأ شائع: كتابة رقم مع كلمات
هذا أيضًا يسبب الخطأ:
int("10 years")
لأن القيمة ليست رقمًا فقط، بل تحتوي على كلمة.
الصحيح أن تكون القيمة:
int("10")
أفضل طريقة لتجنب الخطأ
لتجنب خطأ ValueError invalid literal for int، اتبع هذه النصائح:
- لا تستخدم
int()على نص غير رقمي. - تذكر أن
input()ترجع نصًا دائمًا. - استخدم
try exceptعند التعامل مع إدخال المستخدم. - استخدم
float()إذا كنت تتوقع رقمًا عشريًا. - اكتب رسالة واضحة للمستخدم تخبره بما يجب إدخاله.
روابط مفيدة
لفهم المثال المرتبط بهذا الخطأ، اقرأ: بايثون بالمثال 2: معرفة هل الرقم زوجي أم فردي في Python.
ولفهم أنواع البيانات والتحويل بينها، اقرأ: أساسيات بايثون 7: أنواع البيانات في Python.
ولفهم رسائل الخطأ عمومًا، اقرأ: فن قراءة رسائل الخطأ في بايثون للمبتدئين.
ويمكنك الرجوع إلى توثيق بايثون الرسمي حول الدوال المدمجة: Python int Documentation.
مقالات مقترحة من بايثون العرب
- مشكلة وحل: حل خطأ IndexError list index out of range في Python
- بايثون بالمثال 1: حذف التكرار من قائمة في Python
- أساسيات بايثون 10: شرح Dictionaries في Python للمبتدئين
خلاصة الحل
خطأ ValueError: invalid literal for int() with base 10 يظهر عندما تحاول تحويل قيمة غير مناسبة إلى عدد صحيح باستخدام int().
مثال خاطئ:
int("hello")
الحل الأفضل عند التعامل مع إدخال المستخدم:
try:
number = int(input("أدخل رقمًا: "))
print(number)
except ValueError:
print("الرجاء إدخال رقم صحيح فقط")
كلما تعاملت مع إدخال المستخدم بطريقة آمنة، ستقل أخطاء برنامجك ويصبح أسهل استخدامًا.
تمرين بسيط لك
اكتب برنامجًا يطلب من المستخدم إدخال عمره، ثم:
- إذا أدخل رقمًا صحيحًا، اطبع العمر.
- إذا أدخل نصًا أو ترك الإدخال فارغًا، اطبع رسالة: الرجاء إدخال عمر صحيح.
حاول استخدام try except في الحل.