2009-08-24 11 views
14

मैं अगर किसी दिए गए अजगर चर देशी प्रकार का एक उदाहरण है निर्धारण करने की आवश्यकता का एक उदाहरण है: str, int, float, bool, list, dict और इतने पर। क्या ऐसा करने का कोई शानदार तरीका है?निर्धारित करें कि अजगर चर एक अंतर्निहित प्रकार

या यह एक ही रास्ता है:

if myvar in (str, int, float, bool): 
    # do something 
+5

आपका मतलब "मूल" प्रकार से क्या है? क्या आपका मतलब बिल्टिन है? तुम्हें यह जानने की आवश्यकता क्यों है? पायथन सी ++ या जावा नहीं है, इसलिए "सरल" या "मूल" प्रकारों के बीच कोई अंतर नहीं है। तुम क्या करने की कोशिश कर रहे हो? –

+0

हां, मुझे लगता है कि मेरा मतलब है "बिल्टिन" प्रकार। मुझे किसी ऑब्जेक्ट के ऐसे प्रतिनिधित्व की आवश्यकता है, जिसे मैं JSON क्रमबद्धरण में उपयोग कर सकता हूं। simplejson केवल ऐसे ही प्रकार "हैंडल"। अन्य मामलों में (जब ऑब्जेक्ट "घर का बना" वर्गों के उदाहरण होते हैं) मुझे dict वस्तुओं को बनाने की आवश्यकता होती है। –

+1

आप जानते हैं कि सरलजसन में "ऑब्जेक्ट डिकोडिंग" और "ऑब्जेक्ट एन्कोडिंग" कहा जाता है? –

उत्तर

12

इस लक्ष्य को हासिल करने के लिए सबसे अच्छा तरीका है primitiveTypes और कहा जाता टपल की एक सूची में प्रकार एकत्र करने के लिए है ।

Works since Python 2.2

+0

thx। शुरुआत में मैंने लिखा है कि यह शायद अधिक सुरुचिपूर्ण है। 'प्रकार' से प्रकारों का उपयोग करके –

+2

अधिक सरल नाम (int, str, float, ...) का उपयोग करने से अलग नहीं है! – u0b34a0f6ae

+0

हां, इस प्रकार प्रकार काम करता है। लेकिन यह आपके इरादे को और अधिक साफ करता है और यदि आप पूर्वनिर्धारित सेट (स्ट्रिंगटाइप) का उपयोग करते हैं, तो आपको पाइथन संस्करणों के बीच अतिरिक्त पोर्टेबिलिटी मिलती है। –

1

प्रकार समारोह में निर्मित सहायक हो सकता है:

>>> a = 5 
>>> type(a) 
<type 'int'> 
2

एक "देशी प्रकार" पायथन में क्या है? कृपया अपने कोड को प्रकारों पर आधारित न करें, Duck Typing का उपयोग करें।

+0

धन्यवाद, मैं इसे करने से पहले दो बार सोचूंगा =) –

7

ऐसा नहीं है कि मुझे पता है कि आप ऐसा क्यों करना चाहते हैं, क्योंकि पाइथन में कोई भी "सरल" प्रकार नहीं है, यह सभी ऑब्जेक्ट्स है। लेकिन यह काम करता है:

type(theobject).__name__ in dir(__builtins__) 

लेकिन स्पष्ट रूप से प्रकारों को सूचीबद्ध करना शायद बेहतर है क्योंकि यह स्पष्ट है। या इससे भी बेहतर: एप्लिकेशन को बदलना ताकि आपको अंतर जानने की आवश्यकता न हो।

अद्यतन: समस्या को हल करने की समस्या यह है कि वस्तुओं के लिए एक धारावाहिक बनाने के लिए, यहां तक ​​कि उन अंतर्निर्मित भी हैं। ऐसा करने का सबसे अच्छा तरीका एक बड़ा फ़ैट सीरियलाइज़र नहीं बनाना है जो बिल्टिन को अलग-अलग व्यवहार करता है, लेकिन प्रकार के आधार पर क्रमबद्धता को देखने के लिए।

कुछ इस तरह:

def IntSerializer(theint): 
    return str(theint) 

def StringSerializer(thestring): 
    return repr(thestring) 

def MyOwnSerializer(value): 
    return "whatever" 

serializers = { 
    int: IntSerializer, 
    str: StringSerializer, 
    mymodel.myclass: MyOwnSerializer, 
} 

def serialize(ob): 
    try: 
     return ob.serialize() #For objects that know they need to be serialized 
    except AttributeError: 
     # Look up the serializer amongst the serializer based on type. 
     # Default to using "repr" (works for most builtins). 
     return serializers.get(type(ob), repr)(ob) 

इस तरह से आप आसानी से नए serializers जोड़ सकते हैं, और कोड, बनाए रखने के लिए आसान है और स्पष्ट है के रूप में प्रत्येक प्रकार के अपने स्वयं के serializer है। ध्यान दें कि कैसे कुछ प्रकार निर्मित किए गए तथ्य पूरी तरह से अप्रासंगिक हो गए हैं।

if isinstance(myvar, primitiveTypes): ... 

types module सभी महत्वपूर्ण प्रकार के संग्रह जो सूची का निर्माण करने में मदद कर सकते हैं/टपल: :)

+4

यह काम करता है, लेकिन आपको इसका उपयोग नहीं करना चाहिए:/ – NicDumZ

+0

+1 "एप्लिकेशन बदलना तो आपको अंतर जानने की जरूरत नहीं है। " कुछ (अत्यंत दुर्लभ) समय जानने के लिए necesary है, लेकिन सबसे अधिक संभावना नहीं है। – voyager

7

आप simplejson आश्वस्त अपने प्रकार संभाल लेंगे में रुचि दिखाई देते हैं। यह

try: 
    json.dumps(object) 
except TypeError: 
    print "Can't convert", object 

यह अनुमान लगाने की कोशिश करने से अधिक विश्वसनीय है कि आपके JSON कार्यान्वयन किस प्रकार से हैंडल करता है।

+0

यह अधिक पायथनिक कारण है यदि वस्तु को डंप किया जा सकता है (शायद सरलजसन अधिक समर्थन जोड़ता है) तो इसका पहले उपयोग किया जाएगा, और फिर सिवाय इसके कि आपको अपनी पकड़ कार्यक्षमता को कॉल करना चाहिए। +1 –

0

S.Lott के जवाब के बंद का निर्माण आप कुछ इस तरह होना चाहिए:


from simplejson import JSONEncoder 

class JSONEncodeAll(JSONEncoder): 
    def default(self, obj): 
    try: 
     return JSONEncoder.default(self, obj) 
    except TypeError: 
     ## optionally 
     # try: 
     # # you'd have to add this per object, but if an object wants to do something 
     # # special then it can do whatever it wants 
     # return obj.__json__() 
     # except AttributeError: 
     ## 

     # ...do whatever you are doing now... 
     # (which should be creating an object simplejson understands) 

उपयोग करने के लिए:


>>> json = JSONEncodeAll() 

>>> json.encode(myObject) 
# whatever myObject looks like when it passes through your serialization code 

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

5

यह एक पुराना प्रश्न है लेकिन ऐसा लगता है कि कोई भी जवाब वास्तव में विशिष्ट प्रश्न का उत्तर नहीं देता है: "(कैसे करें) निर्धारित करें कि पाइथन चर एक अंतर्निहित प्रकार का उदाहरण है "। ध्यान दें कि यह विशिष्ट/दिया गया अंतर्निहित प्रकार "[...] है लेकिन का है।

को उचित तरीके से निर्धारित यदि किसी विशेष वस्तु का एक उदाहरण है एक buil में टाइप/वर्ग वस्तु के प्रकार के मॉड्यूल __builtin__ में परिभाषित किया जा करने के लिए होता है, तो जाँच करने के लिए है।

def is_builtin_class_instance(obj): 
    return obj.__class__.__module__ == '__builtin__' 

चेतावनी: यदि obj एक वर्ग और नहीं एक उदाहरण, कोई फर्क नहीं पड़ता है, तो उस वर्ग में निर्मित है या नहीं, यह सच है लौटा दी जाएगी के बाद से एक वर्ग भी एक वस्तु, type का एक उदाहरण है (यानी AnyClass.__class__type है)।

1

आप types मॉड्यूल द्वारा इन सभी प्रकार का उपयोग कर सकते हैं: सबसे अच्छा विकल्प मेरे लिए

`builtin_types = [ i for i in types.__dict__.values() if isinstance(i, type)]` 

एक चेतावनी के रूप, आयात मॉड्यूल types पहले

def isBuiltinTypes(var): 
    return type(var) in [i for i in types.__dict__.values() if isinstance(i, type)] and not isinstance(var, types.InstanceType) 
0

है:

allowed_modules = set(['numpy']) 
def isprimitive(value): 
    return not hasattr(value, '__dict__') or \ 
    value.__class__.__module__ in allowed_modules 

यह तय करता है कि मान एक मॉड्यूल है और value.__class__.__module__ == '__builtin__' विफल हो जाएगा।

संबंधित मुद्दे