यदि आप एक चर पायथन में एक शब्दकोश है, तो आप कैसे जांचेंगे?
यह एक उत्कृष्ट प्रश्न है, लेकिन यह दुर्भाग्यपूर्ण है कि सबसे अधिक उत्तर दिया गया उत्तर एक खराब सिफारिश के साथ होता है, type(obj) is dict ।
(ध्यान दें कि आपको भी उपयोग नहीं करना चाहिए dict एक चर नाम के रूप में - यह बिलिन ऑब्जेक्ट का नाम है।)
यदि आप ऐसा कोड लिख रहे हैं जो आयात किया जाएगा और दूसरों द्वारा उपयोग किया जाता है, तो यह न मानें कि वे सीधे ताना-बाना का उपयोग करेंगे - यह मानते हुए कि अनुमान आपके कोड को अधिक अनम्य बनाता है और इस मामले में, आसानी से छिपे हुए बग बनाएं जो प्रोग्राम को त्रुटि नहीं देगा। ।
मैं भविष्य में उपयोगकर्ताओं के लिए शुद्धता, स्थिरता और लचीलेपन के उद्देश्यों के लिए दृढ़ता से सुझाव देता हूं, जब आपके कोड अधिक लचीले, मुहावरेदार भाव होते हैं, तो आपके कोड में कम लचीले, असमान भाव नहीं होते हैं।
isवस्तु पहचान के लिए एक परीक्षा है । यह विरासत का समर्थन नहीं करता है, यह किसी भी अमूर्तता का समर्थन नहीं करता है, और यह इंटरफ़ेस का समर्थन नहीं करता है।
इसलिए मैं कई विकल्प प्रदान करूँगा जो करते हैं।
सहायक विरासत:
यह पहली सिफारिश मैं होगा है, क्योंकि यह उपयोगकर्ताओं को एक dict के अपने स्वयं के उपवर्ग, या आपूर्ति करने के लिए अनुमति देता है OrderedDict, defaultdictया Counterसे संग्रह मॉड्यूल:
if isinstance(any_object, dict):
लेकिन और भी अधिक लचीले विकल्प हैं।
सहायक सार:
from collections.abc import Mapping
if isinstance(any_object, Mapping):
यह आपके कोड के उपयोगकर्ता को अमूर्त मानचित्रण के अपने स्वयं के कस्टम कार्यान्वयन का उपयोग करने की अनुमति देता है, जिसमें कोई उपवर्ग भी शामिल है dict, और फिर भी सही व्यवहार मिलता है।
इंटरफ़ेस का उपयोग करें
आप आमतौर पर OOP की सलाह सुनते हैं, "एक इंटरफ़ेस के लिए प्रोग्राम"।
यह रणनीति पायथन के बहुरूपता या बतख-टाइपिंग का लाभ उठाती है।
तो बस विशिष्ट उम्मीद त्रुटियों को पकड़ने इंटरफ़ेस का उपयोग करने का प्रयास, ( AttributeErrorमामले में कोई है .itemsऔर TypeErrorमामले में itemsप्रतिदेय नहीं है) एक उचित वापस आने के साथ - और अब किसी भी वर्ग है कि लागू करता है कि इंटरफेस आप अपने आइटम (टिप्पणी दे देंगे .iteritems()पायथन में चला गया है 3):
try:
items = any_object.items()
except (AttributeError, TypeError):
non_items_behavior(any_object)
else: # no exception raised
for item in items: ...
शायद आप सोच सकते हैं कि इस तरह के डक-टाइपिंग का उपयोग बहुत अधिक झूठी सकारात्मक के लिए अनुमति देने में बहुत दूर जाता है, और यह इस कोड के लिए आपके उद्देश्यों के आधार पर हो सकता है।
निष्कर्ष
isमानक नियंत्रण प्रवाह के प्रकार जाँचने के लिए उपयोग न करें । उपयोग करें isinstance, जैसे अमूर्तता पर विचार करें , Mappingया MutableMappingसीधे इंटरफ़ेस का उपयोग करके, पूरी तरह से जाँच से बचने पर विचार करें।