এটি __dunder__প্রায়শই তাদের সমতুল্য অপারেটরগুলির জন্য উপযুক্ত প্রতিস্থাপন নয় বলে কেন পদ্ধতিগুলি সরাসরি ব্যবহার করা উচিত নয় এটির একটি দুর্দান্ত উদাহরণ ; ==সমতা তুলনা করার পরিবর্তে আপনার অপারেটরটি ব্যবহার করা উচিত , বা এই বিশেষ ক্ষেত্রে, যখন পরীক্ষা করা হয় তখন Noneব্যবহার করুন is(আরও তথ্যের জন্য উত্তরের নীচে যান)।
আপনি করেছেন
None.__eq__('a')
# NotImplemented
NotImplementedযেগুলি তুলনা করা হচ্ছে তার চেয়ে আলাদা যেগুলি ফেরত দেয়। অন্য একটি উদাহরণ বিবেচনা করুন যেখানে এই ফ্যাশনে বিভিন্ন ধরণের দুটি বস্তুর তুলনা করা হচ্ছে, যেমন 1এবং 'a'। এরকম (1).__eq__('a')আরো সঠিক নয়, এবং ফিরে আসবে NotImplemented। সমতা জন্য এই দুটি মান তুলনা করার সঠিক উপায় হবে
1 == 'a'
# False
এখানে কি হয়
- প্রথমে
(1).__eq__('a')চেষ্টা করা হয়, যা ফিরে আসে NotImplemented। এটি নির্দেশ করে যে অপারেশন সমর্থিত নয়, তাই
'a'.__eq__(1)বলা হয়, যা একই একই প্রদান করে NotImplemented। সুতরাং,
- অবজেক্টগুলি এমনভাবে ব্যবহার করা হয় যেন সেগুলি এক নয় এবং
Falseফিরে আসে।
এটি কীভাবে ঘটে তা চিত্রিত করার জন্য কিছু কাস্টম ক্লাস ব্যবহার করে একটি দুর্দান্ত ছোট্ট MCVE:
class A:
def __eq__(self, other):
print('A.__eq__')
return NotImplemented
class B:
def __eq__(self, other):
print('B.__eq__')
return NotImplemented
class C:
def __eq__(self, other):
print('C.__eq__')
return True
a = A()
b = B()
c = C()
print(a == b)
# A.__eq__
# B.__eq__
# False
print(a == c)
# A.__eq__
# C.__eq__
# True
print(c == a)
# C.__eq__
# True
অবশ্যই, এটি ব্যাখ্যা করে না যে কেন অপারেশন সত্য হয়। এটি হ'ল NotImplementedপ্রকৃত সত্য মূল্য:
bool(None.__eq__("a"))
# True
একই রকম,
bool(NotImplemented)
# True
কোন মানগুলি সত্যবাদী এবং মিথ্যা বলে বিবেচিত হয় সে সম্পর্কে আরও তথ্যের জন্য, সত্যের মান পরীক্ষার উপর ডকস বিভাগটি দেখুন , পাশাপাশি এই উত্তরটিও দেখুন । এখানে যে মূল্য লক্ষ NotImplementedtruthy, কিন্তু এটা হয়েছে একটি ভিন্ন গল্প বর্গ একটি নির্ধারিত হত __bool__বা __len__পদ্ধতি যা ফিরে Falseবা 0যথাক্রমে।
আপনি যদি ==অপারেটরের ক্রিয়ামূলক সমতুল্য চান তবে ব্যবহার করুন operator.eq:
import operator
operator.eq(1, 'a')
# False
যাইহোক, পূর্বে উল্লিখিত হিসাবে, এই নির্দিষ্ট দৃশ্যের জন্য None, আপনি যেখানে পরীক্ষা করছেন সেখানে ব্যবহার করুন is:
var = 'a'
var is None
# False
var2 = None
var2 is None
# True
এর কার্যকরী সমতুল্য ব্যবহার করছে operator.is_:
operator.is_(var2, None)
# True
Noneএকটি বিশেষ অবজেক্ট এবং যে কোনও সময়ে মেমরিতে কেবলমাত্র 1 সংস্করণ বিদ্যমান। আইওডাব্লু, এটি NoneTypeক্লাসের একমাত্র সিঙ্গলটন (তবে একই বস্তুর অনেকগুলি রেফারেন্স থাকতে পারে)। PEP8 নির্দেশিকা এই স্পষ্ট করুন:
সিঙ্গেলনের মতো তুলনা Noneসর্বদা isবা
is notসমতা অপারেটরগুলির সাথে করা উচিত ।
সংক্ষেপে বলা যায়, singletons পছন্দ None, সঙ্গে একটি রেফারেন্স চেক isআরো উপযুক্ত, যদিও উভয় ==এবং isঠিক সূক্ষ্ম কাজ করবে।