पायथन जाँच करता है कि क्या सूची में किसी भी प्रकार की स्थापना है?


87

मैं कैसे pythonicly करते हैं:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

यह मूर्खतापूर्ण लगता है कि मैं सिर्फ classinfo की सूची में पास नहीं कर सकता:

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

तो isinstanceofanyकार्य क्या है ?


अगर यह एक नंबर की तरह जुड़ता है, एक नंबर की तरह घटता है, एक नंबर की तरह बढ़ता है ... आपको यह जानने की आवश्यकता है कि क्या यह नंबर है? देखें बतख टाइपिंग अधिक जानकारी के लिए।
मोटो

मेरे विशेष उपयोग के मामले में एक फ़ंक्शन होता है जो एक रिटर्न देता है (ऐसा फ़ंक्शन जो वापस लौटता है (या तो numberया यह एक दुखद अभिव्यक्ति देता है)। मैं यह जांचना चाहता हूं कि मैंने जो फ़ंक्शन उत्पन्न किया है, वह वही करता है जब मैं इसे अन्य कार्यों के लिए पास करता हूं।
D एडम्स

आपका कार्य कुछ सजातीय क्यों नहीं लौटाता है? यही गंध यहाँ है; आप बतख टाइपिंग के साथ तेज़ और ढीले हो सकते हैं, लेकिन आपको जो भी लौटाना है, उसके अनुरूप होना चाहिए।
मोटो

मुझे लगता है कि मैं हमेशा एक संवेदनात्मक अभिव्यक्ति वापस कर सकता हूं जो कभी-कभी किसी संख्या का मूल्यांकन करता है, और कभी-कभी इसके अंदर चर भी होते हैं।
D एडम्स

यही मैं सोच रहा हूँ कि आप यहाँ क्या करना चाहते हैं; कई अलग-अलग प्रकारों को वापस करने के बजाय, एक प्रकार को वापस करें और यदि आवश्यक हो, तो इसे एक संख्या के बजाय घटाएं।
मोटो

जवाबों:


191

isinstance()एक लेता है टपल दूसरा तर्क के लिए कक्षाओं की। यह सही होगा यदि पहला तर्क उस क्रम में किसी प्रकार का उदाहरण है :

isinstance(var, (classinfo1, classinfo2, classinfo3))

दूसरे शब्दों में, isinstance() पहले से ही बॉक्स के बाहर यह कार्यक्षमता प्रदान करता है।

से isinstance()प्रलेखन :

यदि classinfo न तो कोई क्लास ऑब्जेक्ट है और न ही टाइप ऑब्जेक्ट है, तो यह क्लास या टाइप ऑब्जेक्ट्स का टपल हो सकता है, या अन्य ऐसे ट्यूपल्स (अन्य सीक्वेंस टाइप्स को स्वीकार नहीं किया जाता है) को पुनरावर्ती कर सकता है।

जोर मेरा; पुनरावर्ती प्रकृति पर ध्यान दें; (classinfo1, (classinfo2, classinfo3))एक वैध विकल्प भी है।


मददगार, धन्यवाद!
याकोव ब्रेसलर

11

आप पहले से ही अपने प्रश्न के शीर्षक के साथ बहुत करीब थे। आप उपयोग कर सकते हैं anyऔर एक सूची:

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

लेकिन isinstanceपता चलता है कि डॉक्स में :

यदि ऑब्जेक्ट तर्क classinfo तर्क का एक उदाहरण है, या (प्रत्यक्ष, अप्रत्यक्ष या आभासी) उप-वर्ग के लिए सही है तो वापस लौटें। यदि ऑब्जेक्ट दिए गए प्रकार का ऑब्जेक्ट नहीं है, तो फ़ंक्शन हमेशा गलत होता है। यदि classinfo एक वर्ग (प्रकार ऑब्जेक्ट) नहीं है, तो यह टाइप ऑब्जेक्ट्स का एक टपल हो सकता है , या अन्य ऐसे ट्यूपल्स को पुनरावर्ती रूप से शामिल कर सकता है (अन्य अनुक्रम प्रकार स्वीकार नहीं किए जाते हैं)। यदि classinfo एक प्रकार या इस प्रकार के टुपल्स नहीं हैं, तो टाइपरर अपवाद को उठाया जाता है।

इसका मतलब यह है कि यह बेहतर तरीका है

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))

2
दोहरा isinstanceकेवल के साथ classinfoबदलते मेरे लिए बहुत pythonic प्रतीत नहीं होता।
मोटो

1
कोशिश करो var.__class__। क्या तुम यही चाहते हो? @ माकोतो: मैं सहमत हूं। पाइथोनिक बिल्कुल नहीं!
फ्लेमेंको

@ माकोतो यूप। लेकिन यह कुछ ऐसा था जो डी एडम्स "डॉक्स" के लिए डॉक्स खोज कर आसानी से पा सकते थे। मैंने अपने उत्तर को बेहतर संस्करण में विस्तारित किया है ... लेकिन जाहिर है कि मार्टिज़न पीटर तेजी से ... एक बार फिर।
मार्टिन थोमा

3
any()एक सूची के साथ .. व्यर्थ है। एक जनरेटर अभिव्यक्ति का उपयोग करें यदि आप का उपयोग करना चाहिए any(), तो कम से कम आपको शुरुआती निकास का लाभ मिलता है।
मार्टिन पीटर्स

मुझे लगता है कि isinstanceटपल के साथ जाने का रास्ता है। मैं सिर्फ समाधान का उल्लेख करना चाहता था anyक्योंकि ऐसा लगता था कि वह शीर्षक में क्या पूछ रहा है।
मार्टिन थोमा

4

इससे आपकी समस्या दूर हो जाएगी:

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

दस्तावेज़ीकरण के आधार पर बहुत सारे तरीके हैं जिनसे आप में प्रकारों के मूल्यों को पास कर सकते हैं isinstance

तुम भी में लग सकता है कामुक अगर आप एक अधिक जटिल सत्यापन जिनमें से यह सिर्फ एक हिस्सा है करने के लिए कोशिश कर रहे हैं।


आइंस्टीन () पहले से ही इस कार्यक्षमता प्रदान करता है, 2 तर्क के रूप में जाँचने के लिए सभी आवश्यक प्रकारों के साथ एक टपल पास करें
RFV

@ RFV5s हां .... यही वह उदाहरण है जो मैंने यहां प्रदान किया है। आपकी क्या आपत्ति है?
नथानिएल फोर्ड

1

आपको आमतौर पर उपयोग नहीं करना चाहिए isinstance, लेकिन आप जो करना चाहते हैं उसे किसी भी () बिल्टइन फ़ंक्शन के साथ पूरा किया जा सकता है ।

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

7
यह ओवरकिल है; isinstance()उपयोग किए बिना बॉक्स से कार्यक्षमता प्रदान करता है any()
मार्टिन पीटर्स

@MartijnPieters मुझे महसूस नहीं हुआ कि आइंस्टीन कई प्रकार ले सकता है, लेकिन मुझे ऐसा लगता है कि उत्तर अभी भी एक अच्छा है क्योंकि प्रश्न को अधिक व्यापक रूप से लिया जा सकता है "मैं कैसे जांचता हूं कि क्या किसी विशेष फ़ंक्शन से वापसी मान किसी भी अलग-अलग पारमों के साथ सत्य है "
चाड एस।

आप का उपयोग करना चाहिए या नहीं isinstance()अप्रासंगिक है।
5

@ChadS। मैं आपसे पूछना चाहता हूं कि आपको क्यों लगता है कि उसे इस्तेमाल नहीं करना चाहिए isinstance()? धन्यवाद।
मूर्ति

क्योंकि अजगर एस्क्यूव्स चेकिंग टाइप करता है। यह थोड़ा लाभ के लिए अतिरिक्त कोड (और सीपीयू साइकिल) है। बतख टाइपिंग को प्राथमिकता दी जाती है।
चाड एस।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.