__CMP__ الطريقة ألا يعمل هذا كما هو متوقع في Python 2.x؟
-
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__
.
يجب أن تعيد عدد صحيح سلبي إذا كان ذاتيًا <آخر ، 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 == آخر ، عددًا صحيحًا إيجابيًا إذا كان ذاتيًا> آخر.