سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل هناك python المدمج في datatype، بجانب None, ، لأي منهم:

>>> not foo > None
True

أين foo هي قيمة هذا النوع؟ ماذا عن بيثون 3؟

هل كانت مفيدة؟

المحلول

None هو دائما أقل من أي نوع بيانات في بيثون 2 (انظر object.c).

في بيثون 3، تم تغيير هذا؛ الآن القيام بمقارنات على الأشياء دون نتائج أمر طبيعي معقول في TypeError. وبعد من 3.0 "ما الجديد" التحديثات:

قام Python 3.0 بتبسيط القواعد الخاصة بمقارنات الطلب:

مشغلي مقارنة الطلب (<, <=, >=, >) رفع أ TypeError استثناء عندما لا يكون لدى المعاملات طلبا طبيعيا ذا معنى. وبالتالي، تعبيرات مثل: 1 < '', 0 > None أو len <= len لم تعد صالحة، و None < None يثير TypeError بدلا من العودة False. وبعد النتيجة الطبيعية هي أن فرز قائمة غير متجانسة لم تعد منطقية - يجب أن تكون جميع العناصر قابلة للمقارنة مع بعضها البعض. لاحظ أن هذا لا ينطبق على == و != المشغلون: كائنات أنواع مختلفة لا تضاهى دائما مقارنة غير متكافئة بعضها البعض.

هذا يزعج بعض الناس لأنه غالبا ما يكون مفيدا للقيام بأشياء مثل فرز قائمة كانت لديها بعض None القيم فيه، ولها None تظهر القيم متفاوتة معا في البداية أو النهاية. كان هناك موضوع في القائمة البريدية حول هذا الموضوع مرة أخرى، لكن النقطة النهائية هي أن بيثون 3 يحاول تجنب اتخاذ قرارات تعسفية حول الطلب (وهو ما حدث كثيرا في بيثون 2).

نصائح أخرى

من بيثون 2.7.5 مصدر (object.c):

static int
default_3way_compare(PyObject *v, PyObject *w)
{
    ...
    /* None is smaller than anything */
    if (v == Py_None)
            return -1;
    if (w == Py_None)
            return 1;
    ...
}

تعديل: رقم الإصدار المضافة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top