python - उनल - पायथन में टाइप करने के लिए कैननिकल तरीका क्या है?




हिंदी में लिखने वाला अप्प्स (6)

आप नीचे दिए गए लाइन से जांच सकते हैं कि यह देखने के लिए कि कौन सा चरित्र दिया गया मान है:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

यह जांचने का सबसे अच्छा तरीका क्या है कि दिया गया ऑब्जेक्ट किसी दिए गए प्रकार का है या नहीं? यह जांचने के बारे में कि ऑब्जेक्ट किसी दिए गए प्रकार से प्राप्त होता है या नहीं?

मान लें कि मेरे पास ऑब्जेक्ट है o । मैं कैसे str कि यह एक str ?


ऑब्जेक्ट के प्रकार की जांच करने का सबसे पायथन तरीका है ... इसे जांचना नहीं।

चूंकि पाइथन डक टाइपिंग को प्रोत्साहित करता है, इसलिए आपको ऑब्जेक्ट के तरीकों का उपयोग करने की कोशिश करनी चाहिए जिस तरह से आप उनका उपयोग करना चाहते हैं। तो यदि आपका फ़ंक्शन एक लिखने योग्य फ़ाइल ऑब्जेक्ट की तलाश में है, तो यह जांचें कि यह file उप-वर्ग है, बस इसकी .write() विधि का उपयोग करने का प्रयास करें!

बेशक, कभी-कभी ये अच्छे isinstance(obj, cls) टूट जाते हैं और isinstance(obj, cls) की आवश्यकता होती है। लेकिन कम से कम उपयोग करें।


मुझे लगता है कि पाइथन जैसे गतिशील भाषा का उपयोग करने के बारे में अच्छी बात यह है कि आपको वास्तव में ऐसा कुछ नहीं देखना चाहिए।

मैं बस अपनी ऑब्जेक्ट पर आवश्यक विधियों को कॉल करूंगा और एक AttributeError । बाद में इस पर आप विभिन्न तरीकों को पूरा करने के लिए अन्य तरीकों (प्रतीत होता है असंबंधित) ऑब्जेक्ट्स के साथ अपनी विधियों को कॉल करने की अनुमति देंगे, जैसे परीक्षण के लिए ऑब्जेक्ट का मज़ाक करना।

मैंने urllib2.urlopen() साथ वेब से डेटा प्राप्त करते समय यह बहुत उपयोग किया है जो ऑब्जेक्ट जैसी फ़ाइल लौटाता है। यह बदले में किसी भी विधि से पढ़ा जा सकता है जो किसी फ़ाइल से पढ़ता है, क्योंकि यह वास्तविक फ़ाइल के रूप में एक ही read() विधि को लागू करता है।

लेकिन मुझे यकीन है कि isinstance() का उपयोग करने के लिए एक समय और स्थान है, अन्यथा यह शायद वहां नहीं होगा :)


यह जांचने के लिए कि क्या o str उदाहरण है या str किसी भी उप-वर्ग (यह "कैननिकल" तरीका होगा):

if isinstance(o, str):

यह जांचने के लिए कि o का प्रकार बिल्कुल सही है या नहीं:

if type(o) is str:

निम्नलिखित भी काम करता है, और कुछ मामलों में उपयोगी हो सकता है:

if issubclass(type(o), str):

if type(o) in ([str] + str.__subclasses__()):

प्रासंगिक जानकारी के लिए पाइथन पुस्तकालय संदर्भ में अंतर्निहित कार्य देखें।

एक और नोट: इस मामले में, आप वास्तव में उपयोग करना चाहते हैं:

if isinstance(o, basestring):

क्योंकि यह यूनिकोड तारों को भी पकड़ लेगा ( unicode str उप-वर्ग नहीं है; दोनों str और unicode basestring उप-वर्ग हैं)।

वैकल्पिक रूप से, isinstance कक्षाओं के एक tuple स्वीकार करता है। यह सही होगा यदि एक्स किसी भी (str, यूनिकोड) के किसी भी उप-वर्ग का उदाहरण है:

if isinstance(o, (str, unicode)):

ह्यूगो के लिए:

आप शायद array बजाय list मतलब है, लेकिन यह टाइपिंग जांच के साथ पूरी समस्या को इंगित करता है - आप यह नहीं जानना चाहते कि प्रश्न में वस्तु एक सूची है या नहीं, आप जानना चाहते हैं कि यह किसी प्रकार का अनुक्रम है या यदि यह एकल है वस्तु। तो इसे अनुक्रम की तरह उपयोग करने का प्रयास करें।

मान लें कि आप ऑब्जेक्ट को मौजूदा अनुक्रम में जोड़ना चाहते हैं, या यदि यह ऑब्जेक्ट्स का अनुक्रम है, तो उन्हें सभी जोड़ें

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

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

मैं आमतौर पर अपने एपीआई को डिज़ाइन करना चुनता हूं ताकि यह केवल एक ही मान या अनुक्रम को स्वीकार कर सके - इससे चीजों को आसान बना दिया जाता है। जब आप आवश्यकता हो तो इसे पार करते समय अपने एकल मूल्य के चारों ओर एक [ ] रखना मुश्किल नहीं है।

(हालांकि यह तारों के साथ त्रुटियों का कारण बन सकता है, क्योंकि वे अनुक्रमों की तरह दिखते हैं।)


isinstance(o, str) true हो जाएगा यदि o एक str या एक प्रकार का है जो str से विरासत में मिलता है।

type(o) is str true हो जाएगा यदि केवल और यदि o एक स्ट्र है। अगर यह एक प्रकार का है जो str से विरासत में आता है तो यह false वापसी करेगा। ----





types