بايثون / دليل حلول تحريري
حل TypeError وNone غير المتوقعة وأخطاء التحويل
تتبع القيمة الفعلية إلى أصلها، وافصل التحويل عن التحقق، وأصلح العقد الذي أدخل النوع الخاطئ.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد يثير الحساب أو الجمع TypeError، أو تحاول فهرسة None، أو ترفع int استثناء ValueError لنص خارجي. قد يقع الفشل الظاهر بعد عدة استدعاءات من إنشاء القيمة الخاطئة.
قد تطبع الدالة العدد الصحيح لكنها تعيد None. وتعدل sort القائمة في مكانها وتعيد None أيضا، مما يفسر إسنادا مفاجئا.
افهم الأسباب المحتملة
- تشمل الأسباب خلط النص والعدد، أو نسيان return في فرع، أو إسناد نتيجة معدل موضعي، أو افتراض فرض العلامات النوعية وقت التشغيل.
- يختلف التحويل عن التحقق: يحلل "3"، ولا يحلل "many"، ويحلل "-3" لكنه قد يخالف شرط الكمية غير السالبة.
1. تتبع القيمة إلى منتجها
اقرأ الاستثناء وحدد العملية وأنواع المعاملات. افحص محليا تمثيلا صغيرا آمنا أو اسم النوع دون سجلات حساسة كاملة. ارجع عبر الإسنادات وreturn حتى أول قيمة تخالف العقد. لا تحول كل شيء إلى str، فقد تجعل النتيجة العددية المفقودة النص "None" وتخفي العيب. صغر المدخل مع الاحتفاظ بالاختلاف.
2. أصلح النتائج المفقودة وافتراضات التعديل الموضعي
راجع كل مسار للدالة عندما يحتاج المستدعي إلى نتيجة. الطباعة أثر عرض وليست بديلا عن return. ميز تعديل القائمة بواسطة sort من إنشاء قائمة جديدة بواسطة sorted. لا تسند items = items.sort(). يحفظ المثال الأصل ويسمي القائمة الجديدة بشكل مستقل ليوضح الملكية. أصلح الفشل اللاحق عند المنتج، لا بقيمة افتراضية بعيدة تغير معنى الغياب بصمت.
items = [3, 1, 2]
ordered = sorted(items)
print(items)
print(ordered)
def double(value):
return value * 2
print(double(4))
[3, 1, 2]
[1, 2, 3]
8
تعيد sorted قائمة جديدة ويبقى الأصل. تعيد الدالة ثمانية صراحة بدلا من مجرد الطباعة داخلها.
3. حلل النص الخارجي ثم تحقق من معناه
اعتبر input() وحقول CSV نصا حتى يحدث تحويل صريح. أحط التحويل وحده بمعالج ValueError ضيق، ثم افحص قيود المجال خارجه. حدد هل النص الفارغ غياب أم خطأ أم قيمة افتراضية موثقة؛ لا تستنتج السياسة من الصدقية. يعالج المثال نصوصا مصطنعة ويميز الصيغة الخاطئة من الكمية السالبة ولا ينفذ المدخل ككود. تحتاج الحدود الحقيقية إلى حد طول وسياق تشخيص آمن. قد يكون فشل التحويل بيانات متوقعة، بينما تكون TypeError غير المرتبطة عيبا برمجيا.
def parse_quantity(text):
try:
value = int(text)
except ValueError as error:
raise ValueError("expected integer text") from error
if value < 0:
raise ValueError("quantity must be nonnegative")
return value
for text in ["3", "many", "-3"]:
try:
print(parse_quantity(text))
except ValueError as error:
print(error)
3
expected integer text
quantity must be nonnegative
تنتج الحالة الصالحة عددا، وتفشل الصيغة الخاطئة في التحليل، أما السالب فينجح تحليله ويفشل قيد المجال.
4. اجعل الغياب حالة صريحة
إذا كانت None نتيجة مشروعة فوثقها وافحص value is None قبل الحساب أو عمليات الحاويات. لا تستخدم if not value إذا كان الصفر أو الفراغ نتيجة مميزة صحيحة. وإذا كانت ممنوعة فأصلح return المفقودة أو حالة المنتج بدلا من قبولها لاحقا. تجنب معالجا عاما يعيد صفرا لكل فشل؛ يجب تمييز الصفر الحقيقي من الحساب الفاشل. أضف اختبار تراجع للمسار الذي أعاد النوع الخطأ.
تحقق من نجاح الإصلاح
تعيد الحالة المصغرة الأصلية النوع والقيمة الموثقين. أعد اختبار الصحيح والصفر والسالب والنص التالف وحالة الغياب المشروعة إذا دعمها العقد.
تأكد من بقاء النتائج الناجحة عددية وتغطية كل مسار إرجاع ومن رفض المدخل برسالة واضحة دون استبداله بنتيجة طبيعية مقنعة.
امنع تكرار المشكلة
- افصل التحليل والحساب والتنسيق. وثق هل تعيد العملية قيمة جديدة أم تعدل في مكانها، واختبر كل فرع يعد بنتيجة.
- شغل الفحص الساكن عند ضبطه مع الاحتفاظ بتحقق وقت التشغيل عند الحدود. لا تستخدم eval لتحويل النص إلى عدد.