बूल इंट का उपवर्ग क्यों है?


84

जब अजगर-मेम्केड के माध्यम से मेमस्कैल्ड में एक बूल का भंडारण करते हैं, तो मैंने देखा कि यह पूर्णांक के रूप में वापस आ गया है। पुस्तकालय के कोड की जाँच ने मुझे दिखाया कि एक जगह है जहाँ isinstance(val, int)एक पूर्णांक के रूप में मूल्य को चिह्नित करने के लिए जाँच की जाती है।

इसलिए मैंने अजगर के खोल में इसका परीक्षण किया और निम्नलिखित पर ध्यान दिया:

>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

लेकिन वास्तव में boolएक उपवर्ग क्यों है int?

यह इस तरह की समझ में आता है क्योंकि एक बूलियन मूल रूप से एक इंट है जो सिर्फ दो मान ले सकता है लेकिन इसे वास्तविक पूर्णांक (कोई अंकगणित, केवल एक बिट स्टोरेज स्पेस) की तुलना में बहुत कम संचालन / स्थान की आवश्यकता होती है ...।



1
यह ध्यान देने योग्य है कि पायथन के बाद से, सब कुछ एक वस्तु है, ओवरहेड के साथ जो कार्यरत है, यह बहुत अधिक व्यर्थ है कि अंतरिक्ष को boolछोटा करके बचाने की कोशिश करें । यदि आपने मेमोरी उपयोग की परवाह की है, तो आप शुरुआत करने के लिए एक अलग भाषा का उपयोग करेंगे।
किंडल

जवाबों:


101

Http://www.peterbe.com/plog/bool-is-int पर एक टिप्पणी से

यह पूरी तरह से तर्कसंगत है, यदि आप आसपास थे जब बूल प्रकार को अजगर (कुछ समय 2.2 या 2.3 के आसपास) में जोड़ा गया था।

वास्तविक बूल प्रकार की शुरुआत से पहले, 0 और 1 C89 के समान सत्य मूल्य के लिए आधिकारिक प्रतिनिधित्व थे। गैर-आदर्श लेकिन काम करने वाले कोड को अनावश्यक रूप से तोड़ने से बचने के लिए, नए बूल प्रकार को 0 और 1 की तरह काम करने की आवश्यकता है। यह केवल सत्य मूल्य से परे जाता है, लेकिन सभी अभिन्न संचालन। कोई भी व्यक्ति संख्यात्मक संदर्भ में बूलियन परिणाम का उपयोग करने की सिफारिश नहीं करेगा और न ही अधिकांश लोग सत्य मूल्य निर्धारित करने के लिए समानता का परीक्षण करने की सिफारिश करेंगे, कोई भी कठिन तरीका नहीं खोजना चाहता था कि मौजूदा कोड कितना है। इस प्रकार क्रमशः 1 और 0 के रूप में ट्रू और फाल्स मस्कारा बनाने का निर्णय। यह भाषाई विकास की एक ऐतिहासिक कलाकृति है।

इस अच्छी व्याख्या के लिए क्रेडिट dman13 को जाता है।


2
ध्यान दें कि यह ऐतिहासिक रूप से सत्य हो सकता है, लेकिन मुहावरेदार रूप से आप बहुत कुछ देखते हैं sum([f(value) for value in values])जहां f(x)कुछ प्रकार के फिल्टर फ़ंक्शन होते हैं और आपको यह देखने की आवश्यकता है कि फ़िल्टर कितने मान पास करते हैं।
एडम स्मिथ

2
व्यक्तिगत रूप से मैं बल्कि लिखूंगा sum(1 for value in values if f(value)), लेकिन मैंने वास्तव में सम्मानित लोगों को बूल पर संख्यात्मक कार्यों के पक्ष में वकालत करते देखा है।
मारियस गेदमिनस

28

PEP 285 देखें - एक बूल प्रकार जोड़ना । पुनरावृत्ति मार्ग:

6) क्या बूल इंट से विरासत में मिले?

=> हाँ।

एक आदर्श दुनिया में, बूल को एक अलग पूर्णांक प्रकार के रूप में बेहतर तरीके से लागू किया जा सकता है जो मिश्रित-मोड अंकगणितीय प्रदर्शन करना जानता है। हालाँकि, इंट से बूल इनहेरिट करना कार्यान्वयन को बड़े पैमाने पर आसान बनाता है (चूंकि सभी C कोड जिसे PyInt_Check () कहते हैं, काम करना जारी रखेगा - यह इंट के उपवर्गों के लिए सही है)।


0

कंसोल में मान helpको जांचने के लिए भी उपयोग कर सकते हैं Bool:

मदद (सच)

help(True)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
 |  

मदद (झूठी)

help(False)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.