কেন বুল ইন্টের একটি সাবক্লাস?


84

পাইথন-মেমক্যাচের মাধ্যমে ম্যাকচেডে একটি বুল সংরক্ষণ করার সময় আমি লক্ষ্য করেছি যে এটি একটি পূর্ণসংখ্যা হিসাবে ফিরে এসেছে। লাইব্রেরির কোডটি পরীক্ষা করে দেখিয়েছি যে এমন একটি জায়গা আছে যেখানে isinstance(val, int)পূর্ণসংখ্যা হিসাবে মানটি পতাকাঙ্কিত করার জন্য পরীক্ষা করা হয়।

তাই আমি অজগর শেলের মধ্যে এটি পরীক্ষা করেছি এবং নিম্নলিখিতগুলি লক্ষ্য করেছি:

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

তবে ঠিক কেন boolএকটি সাবক্লাস হয় int?

এ জাতীয় ধরণের ধারণাটি তৈরি হয় কারণ একটি বুলিয়ান মূলত একটি অন্তর্নিহিত যা কেবল দুটি মান গ্রহণ করতে পারে তবে এটি একটি সত্যসংখ্যক পূর্ণসংখ্যার চেয়ে অনেক কম অপারেশন / স্পেসের প্রয়োজন (কোনও পাটিগণিত নয়, কেবলমাত্র একক স্টোরেজ স্পেস) ....



4
এটি লক্ষণীয় যে পাইথনে যেহেতু, সমস্ত কিছুই একটি অবজেক্ট, ওভারহেড যেটি নিয়োগ করে, এটি আরও boolছোট করে স্থান সাশ্রয় করার চেষ্টা করা একেবারেই অর্থহীন । আপনি যদি মেমরির ব্যবহার সম্পর্কে যত্নশীল হন তবে আপনি শুরু করতে একটি ভিন্ন ভাষা ব্যবহার করবেন।
17:30

উত্তর:


102

Http://www.peterbe.com/plog/bool-is-int- এ একটি মন্তব্য থেকে

এটি পুরোপুরি যৌক্তিক, যদি আপনি যখন বিল টাইপটি পাইথনের সাথে যুক্ত হতেন (তখন প্রায় 2.2 বা 2.3 এর কাছাকাছি ছিল)।

আসল বুলের প্রবর্তন করার আগে, 0 এবং 1 টি সত্যিকার মানের সরকারী উপস্থাপনা ছিল, C89 এর মতো। অযৌক্তিকভাবে অ-আদর্শ কিন্তু কার্যকরী কোডটি ভঙ্গ করা এড়াতে, নতুন বুল টাইপের 0 এবং 1 এর মতো কাজ করা দরকার এটি নিছক সত্যের মানের বাইরে নয়, তবে সমস্ত অবিচ্ছেদ্য ক্রিয়াকলাপ। কেউ সংখ্যা সংক্রান্ত প্রসঙ্গে বুলিয়ান ফলাফল ব্যবহার করার পরামর্শ দেবেন না, বা বেশিরভাগ লোকেরা সত্যের মূল্য নির্ধারণের জন্য সাম্যতার পরীক্ষা করার পরামর্শ দেবেন না, কেউই কোথাও এইভাবে বিদ্যমান কোডটি কত কঠিন উপায় তা জানতে চাননি। সুতরাং যথাক্রমে 1 এবং 0 হিসাবে সত্য এবং মিথ্যা মুখোশ তৈরির সিদ্ধান্ত। এটি কেবল ভাষাগত বিবর্তনের historicalতিহাসিক নিদর্শন।

এই দুর্দান্ত ব্যাখ্যার জন্য ক্রেডিট dman13 এ যায়।


4
নোট করুন যে এটি historতিহাসিকভাবে সত্য হতে পারে তবে পরিচয় হিসাবে আপনি অনেকগুলি দেখতে পাবেন sum([f(value) for value in values])যেখানে f(x)কোনও ধরণের ফিল্টার ফাংশন রয়েছে এবং আপনাকে দেখতে হবে যে কতগুলি মান ফিল্টারটি অতিক্রম করে।
অ্যাডাম স্মিথ

4
ব্যক্তিগতভাবে আমি বরং লিখতে চাই sum(1 for value in values if f(value)), তবে আমি বাস্তবে সম্মানিত লোকদের বুলগুলিতে সংখ্যার ক্রিয়াকলাপের পক্ষে সমর্থন করে দেখেছি।
মারিয়াস গেডমিনাস

29

পিইপি 285 দেখুন - একটি বুল ধরণের যোগ করা । রিলেভেন্ট প্যাসেজ:

)) বুল কি ইনট থেকে উত্তরাধিকারী হতে হবে?

=> হ্যাঁ

একটি আদর্শ বিশ্বে, বুলকে পৃথক পূর্ণসংখ্যার ধরণের হিসাবে আরও ভালভাবে প্রয়োগ করা যেতে পারে যা মিশ্র-মোড পাটিগণিত সম্পাদন করতে জানে। যাইহোক, ইন্ট থেকে উত্তোলনকারী বিলের প্রয়োগ কার্যকরভাবে খুব সহজ করে দেয় (কিছু অংশ যেহেতু সমস্ত সি কোড যা পাইআইন্ট_চেককে কল করে) কাজ চালিয়ে যাবে - এটি আন্তঃক্লাশের জন্য সত্য প্রত্যাবর্তন করে)।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.