__CMP__ الطريقة ألا يعمل هذا كما هو متوقع في Python 2.x؟

StackOverflow https://stackoverflow.com/questions/2146225

  •  23-09-2019
  •  | 
  •  

سؤال

class x:
    def __init__(self,name):
        self.name=name

    def __str__(self):
        return self.name

    def __cmp__(self,other):
        print("cmp method called with self="+str(self)+",other="+str(other))
        return self.name==other.name
       # return False


instance1=x("hello")
instance2=x("there")

print(instance1==instance2)
print(instance1.name==instance2.name)

الإخراج هنا هو:

cmp method called with self=hello,other=there
True
False

وهذا ليس ما كنت أتوقعه: أحاول أن أقول "حالتان متساوية إذا كانت حقول الأسماء متساوية".

إذا كنت ببساطة return False من __cmp__ الوظيفة ، هذا التقارير كما True كذلك!! إذا عدت -1, ثم أحصل False - ولكن بما أنني أحاول مقارنة السلاسل ، فإن هذا لا يشعر بالراحة.

ماذا أفعل خطأ هنا؟

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

المحلول

__cmp__(x,y) يجب إرجاع رقم سالب (على سبيل المثال -1) إذا x < y, ، رقم إيجابي (على سبيل المثال 1) إذا x > y و 0 إذا x == y. يجب ألا تعيد منطقية معها.

ما تفرط فيه هو __eq__(x, y).

نصائح أخرى

ال __cmp__ يجب أن تعود الطريقة -1 أو 0 أو 1 ، عندما تكون الذات <أخرى ، الذات == أخرى ، الذات> الاحترام الآخر.

يمكنك ان تفعل

return cmp(self.name, other.name)

في الكود الخاص بك للحصول على نتيجة مناسبة

أنت مربكة __cmp__ مع __eq__.

من توثيق __cmp__:

يجب أن تعيد عدد صحيح سلبي إذا كان ذاتيًا <آخر ، Zero If Self == آخر ، عددًا صحيحًا إيجابيًا إذا كان ذاتيًا> آخر.

__eq__ إرجاع منطقية تحدد ما إذا كان كائنين متساويين ، __cmp__ إرجاع عدد صحيح يحدد ما إذا كان الكائنان أكبر أو أقل من بعضهما البعض ، وبالتالي يطلق عليهما ما لم يكن لديك محدد __eq__, __ne__, __le__, __ge__, __lt__ و __gt__ طُرق.

في حالتك تريد أ __cmp__ طريقة بدلا من __eq__ لأنه سيوفر لك تنفيذ الطرق الخمس الأخرى للمقارنات الأخرى.

يمكنك استخدام cmp() وظيفة ووضع ما يلي في __cmp__ طريقة:

return cmp(self.name,other.name)

ملحوظة، كما أبرزته Ignacio هذا هو ليست الطريقة المفضلة في بيثون 3.0, ، ولكن في بيثون 2.x __cmp__ هو الطريق للذهاب.

قامت Microsoft الآن بتعطيل Microfeed من العرض في محتويات الموقع وعمل "انتظر الحدث في عنصر القائمة.

أدخل وصف الصورة هنا

الحل البديل

افتح مصمم SharePoint

انقر فوق كافة الملفات> القوائم> انقر بزر الماوس الأيمن فوق الأعلاف المنشورة> خصائص> ضمن الإعدادات إلغاء تنبأ من المتصفح وحفظها. أدخل وصف الصورة هنا

ثم العودة إلى سير العمل الخاص بك وحدد "انتظر الحدث في قائمة القائمة" قيد التشغيل، يجب أن يكون microfeed الآن أمرا قابلا للتأكد من قائمة مرة أخرى. أدخل وصف الصورة هنا

البحث عن الوثائق ل __cmp__, ، من المفترض أن تعيد عدد صحيح:

يجب أن تعيد عدد صحيح سلبي إذا كان ذاتيًا <آخر ، Zero If Self == آخر ، عددًا صحيحًا إيجابيًا إذا كان ذاتيًا> آخر.

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