এটি __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
কোন মানগুলি সত্যবাদী এবং মিথ্যা বলে বিবেচিত হয় সে সম্পর্কে আরও তথ্যের জন্য, সত্যের মান পরীক্ষার উপর ডকস বিভাগটি দেখুন , পাশাপাশি এই উত্তরটিও দেখুন । এখানে যে মূল্য লক্ষ NotImplemented
truthy, কিন্তু এটা হয়েছে একটি ভিন্ন গল্প বর্গ একটি নির্ধারিত হত __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
ঠিক সূক্ষ্ম কাজ করবে।