मैं यह जांचने में सक्षम होना चाहता हूं कि दो कॉल करने योग्य वस्तुएं समान हैं या नहीं। मैं पहचान अर्थशास्त्र ("है" ऑपरेटर का उपयोग करके) पसंद करूंगा, लेकिन मुझे पता चला है कि जब विधियां शामिल होती हैं, तो कुछ अलग होता है।समानता या पहचान के लिए कार्यों का परीक्षण कैसे किया जाना चाहिए?
#(1) identity and equality with a method
class Foo(object):
def bar(self):
pass
foo = Foo()
b = foo.bar
b == foo.bar #evaluates True. why?
b is foo.bar #evaluates False. why?
मैं दोनों अजगर 2.7 और 3.3 (CPython) के साथ इस reproduced किया है यकीन है कि यह पुराने संस्करण के एक कार्यान्वयन विस्तार नहीं है बनाने के लिए। अन्य मामलों में, पहचान परीक्षण की उम्मीद के रूप में काम (दुभाषिया सत्र से जारी):
#(2) with a non-method function
def fun(self):
pass
f = fun
f == fun #evaluates True
f is fun #evaluates True
#(3) when fun is bound as a method
Foo.met = fun
foo.met == fun #evaluates False
foo.met is fun #evaluates False
#(4) with a callable data member
class CanCall(object):
def __call__(self):
pass
Foo.can = CanCall()
c = foo.can
c == foo.can #evaluates True
c is foo.can #evaluates True
सवाल How does Python distinguish callback function which is a member of a class? के अनुसार, एक समारोह में जब एक विधि के रूप बाध्य लपेटा जाता है। यह समझ में आता है और उपरोक्त मामले (3) के साथ संगत है।
क्या किसी अन्य नाम के लिए एक विधि को बांधने का कोई भरोसेमंद तरीका है और बाद में उन्हें कॉल करने योग्य ऑब्जेक्ट या सादे फ़ंक्शन के बराबर तुलना करना चाहिए? यदि "==" चाल करता है, तो यह कैसे काम करता है? उपरोक्त (1) मामले में "==" और "है" अलग तरीके से क्यों व्यवहार करते हैं?
संपादित
@Claudiu के रूप में बताया, Why don't methods have reference equality? का जवाब भी इस सवाल का जवाब है।
क्या आपने इसे देखा है? http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers मुझे लगता है कि यह समझने में थोड़ा सा मदद कर सकता है कि यह क्यों हो रहा है। – taronish4
दिलचस्प प्रश्न, पोस्टिंग के लिए धन्यवाद। (+1) – NPE
हाँ संक्षेप में, ऐसा इसलिए है क्योंकि 'है' को कॉल करते समय यह आईडी के लिए जांचता है और मूल्य नहीं है और दो instancianted ऑब्जेक्ट्स में एक ही आईडी नहीं है जबकि '==' की तुलना में यह मान का मूल्य जांचता है वस्तु और न केवल एक त्वरित आईडी जांच। – Torxed