2012-02-26 10 views
36

उत्तर here उन मामलों के लिए एक हैंडविंग संदर्भ देता है जहां आप __ne____eq__ के तार्किक उलटा के अलावा कुछ और लौटने के लिए चाहते हैं, लेकिन मैं इस तरह के किसी भी मामले की कल्पना नहीं कर सकता। कोई उदाहरण?पाइथन के पास सिर्फ __eq__ की बजाय __ne__ ऑपरेटर विधि क्यों है?

+7

कम से कम '>' और '<=' ऐसे मामले हैं। अर्थात् 'NaN < anything => झूठा' और 'NaN> = कुछ भी => झूठा'। (मान लीजिए पायथन आईईईई फ्लोटिंग पॉइंट लॉजिक का अनुसरण करता है) – CodesInChaos

+3

हां मूल रूप से कुछ भी जिसके पास [कुल ऑर्डर] नहीं है (http://en.wikipedia.org/wiki/Total_ordering) उस श्रेणी में आ सकता है। अब उन चीजों को स्पष्ट कारणों से दुर्लभ हैं, लेकिन वे मौजूद हैं। NaNs एक अच्छा उदाहरण हैं। – Voo

+0

सिर्फ इसलिए कि आप कर सकते हैं। –

उत्तर

28

SQLAlchemy एक महान उदाहरण है। Uninitiated के लिए, SQLAlchemy एक ओआरएम है और एसक्यूएल कथन उत्पन्न करने के लिए पायथन अभिव्यक्ति का उपयोग करता है। एक अभिव्यक्ति इस तरह के

meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id) 

रूप model.Theme.id == model.VoteWarn.post_id एक बूलियन वापस नहीं करता है, लेकिन एक उद्देश्य यह है कि अंततः WHERE theme.id = vote.post_id की तरह एक SQL क्वेरी पैदा करता है। उलटा कुछ WHERE theme.id <> vote.post_id जैसे उत्पादन करेगा ताकि दोनों विधियों को परिभाषित करने की आवश्यकता हो।

29

कुछ पुस्तकालय फैंसी चीजें करते हैं और इन परिचालनों से एक बूल वापस नहीं करते हैं। उदाहरण के लिए, numpy के साथ के लिए:

>>> import numpy as np 
>>> np.array([1,2,5,4,3,4,5,4,4])==4 
array([False, False, False, True, False, True, False, True, True], dtype=bool) 
>>> np.array([1,2,5,4,3,4,5,4,4])!=4 
array([ True, True, True, False, True, False, True, False, False], dtype=bool) 

जब आप एक ही मूल्य या किसी अन्य सरणी के लिए एक सरणी तुलना तुम वापस इसी तत्वों की तुलना के परिणामों की bools की एक सरणी मिलता है। x!=ynot (x==y) के बराबर था, तो आप ऐसा नहीं कर पाए।

+0

मैं इसका पालन नहीं कर सकता। यह ध्यान में रखते हुए कि स्पष्ट रूप से बूल की सरणी पर 'नहीं' परिभाषित किया गया है, फिर भी हमें 'बराबर नहीं' के बजाय 'neq' की आवश्यकता नहीं है। लेकिन स्पष्ट रूप से वहां एक प्रदर्शन और संभावित स्मृति लाभ है। – Voo

+6

जबकि '__not__' विशेष विधि को 'नहीं' ऑपरेटर को ओवरराइड करने के लिए एक विशेष तर्क दिया जा सकता है, यह वर्तमान में पायथन में मौजूद नहीं है। – Weeble

+0

ओह यह आश्चर्यजनक है .. हाँ उस मामले में यह न केवल प्रदर्शन का मामला है। धन्यवाद! – Voo

8

अधिक आम तौर पर, many valued logic सिस्टम, equals और not equals एक दूसरे के अनिवार्य रूप से सटीक नहीं हैं।

स्पष्ट उदाहरण एसक्यूएल है जहां True == True, False == False और Null != Null। हालांकि मुझे नहीं पता कि कोई विशिष्ट पायथन उदाहरण हैं या नहीं, मैं कल्पना कर सकता हूं कि इसे स्थानों में लागू किया जा रहा है।

+1

और MYSQL में, आपके पास ऐसे मूल्य भी हो सकते हैं जो एक ही समय में 'न्यूल' और 'नल नल' हैं! 1! (मुझे लगता है कि MySQL की एक डिजाइन बग हालांकि) –