2011-08-17 14 views
28

मैं एक संयोजक ऑपरेशन में एक स्ट्रिंग को जोड़ने के दौरान एक प्रकार का मिलान करने का प्रयास कर रहा हूं।कैसे पता चले कि एक चर एक tuple, एक स्ट्रिंग या एक पूर्णांक है?

मूल रूप से लौटाई गई त्रुटि एक प्रकार की त्रुटि है (स्ट्रिंग और ट्यूपल को संयोजित नहीं कर सकती); इसलिए मैं यह जानना चाहता हूं कि मैंने स्ट्रिंग के बजाए एक मान को टुपल के रूप में असाइन किया था।

मेरे द्वारा आवंटित सभी मूल्य तार हैं, इसलिए मुझे पता होना चाहिए कि टुपल कहां से आ रहा है, इसलिए मैं उम्मीद कर रहा था कि एक चर के अंदर क्या है और यह पता लगाने के लिए पाइथन में एक तरीका है और यह किस प्रकार है ।

अब तक पीडीबी का उपयोग करके मैं चर की सामग्री की जांच करने में सक्षम था, और मुझे सही मूल्य मिलते हैं जो मैं उम्मीद करता हूं; लेकिन मैं चर के प्रकार को भी जानना चाहता हूं (तर्क से, यदि संकलक एक प्रकार की त्रुटि को बढ़ाने में सक्षम है, तो इसका मतलब है कि यह जानता है कि एक चर के अंदर क्या है और यदि यह संचालन के साथ संगत है, तो वहां उस मान/ध्वज को प्राप्त करने का एक तरीका होना चाहिए)।

क्या Python में एक चर के प्रकार को मुद्रित करने का कोई तरीका है?

बीटीडब्लू, मैंने स्पष्ट रूप से तारों के लिए अपने सभी चर बदलने की कोशिश की, लेकिन str (myvar) को मजबूर करने के लिए संभव नहीं है, इसलिए मैं स्ट्रिंग का उपयोग हर जगह स्ट्रिंग प्रकार के रूप में नहीं डाल सकता।

+1

पिक्य नहीं होना चाहते हैं, लेकिन चर के पास कभी भी पाइथन में एक प्रकार नहीं है, केवल ऑब्जेक्ट्स (चर द्वारा संदर्भित) करते हैं। इस वजह से कोई असली प्रकार नहीं है, केवल रूपांतरण कार्यों को ऑब्जेक्ट करें। –

+0

वास्तव में जुर्गन; मुझे पूरी तरह से पता नहीं है कि पाइथन हुड के नीचे कैसे काम करता है, लेकिन मुझे लगता है कि यह ऑब्जेक्ट उन्मुख भाषा है, इसलिए जब मैं एक चर बना देता हूं तो यह सही डेटाटाइप का एक ऑब्जेक्ट बना देगा और इसे पॉइंटर के साथ संदर्भित करेगा, इसलिए जब मैं इसका उपयोग करता हूं परिवर्तनीय मैं वास्तव में ऑब्जेक्ट स्ट्रिंग (या जो भी अन्य डेटाटाइप) का एक उदाहरण उपयोग कर रहा हूं।अंत बिंदु आपको उस ऑब्जेक्ट का प्रकार प्राप्त करना है :) –

उत्तर

23

तुम बस का उपयोग करें:

type(varname) 

जो होगा उत्पादन पूर्णांक, str, नाव, आदि ...

+0

'__class__' का उपयोग करना लगभग 'टाइप' का उपयोग करने से लगभग हमेशा बेहतर होता है क्योंकि ज्यादातर स्थितियों में, वे वही चीज़ वापस कर देंगे, सिवाय इसके कि' टाइप' प्रकार घोषित करेगा सभी पुराने शैली के वर्गों का 'उदाहरण' होना चाहिए। [यह SO सवाल] देखें (http://stackoverflow.com/questions/1060499/difference-between-typeobj-and-obj-class) –

+0

धन्यवाद गेब्रियल; क्या यह पीडीबी में रनटाइम पर प्रयोग किया जाता है? क्योंकि मैं एक वाक्य रचना त्रुटि मिलती है जब मैं प्रकार (myvarname) करने के लिए –

+0

कोशिश मैं सिर्फ एक प्रिंट प्रकार (myVar) जोड़ा और pdb में टाइप :) '' str' unicode' तारों पर विफल हो जाएगी –

13

मेकअप isinstance के उपयोग?

if isinstance(var, int): 

if isinstance(var, str): 

if isinstance(var, tuple): 
+0

परीक्षण मिल गया है। साथ ही, 'इंस्टेंसेंस (var, tuple)' किसी सूची को होने वाली किसी भी चर को याद करेगा, जो अक्सर इन स्थितियों में उत्पन्न होता है। बेशक, आप यह समझना चाहेंगे कि var 'सूची' का उदाहरण है, लेकिन यह सुनिश्चित करना अच्छा है कि आप जानते हैं कि विभिन्न स्थितियों में क्या होने जा रहा है। –

+0

पायथन 3 में आप परीक्षण के लिए प्रकारों के अनुक्रम का उपयोग कर सकते हैं: 'isinstance (var, (tuple, list))' – bugmenot123

4

आप शायद (पायथन 2.x कल्पना करते हुए) का परीक्षण करने के isinstance(obj, basestring) का उपयोग कर चाहते हैं। आपके पास isinstance, type का उपयोग करने और __class__ विशेषता को कॉल करने का विकल्प है, लेकिन isinstance वह है जो आप यहां चाहते हैं। तीन विकल्पों के बीच अंतर के अधिक गहन उपचार के लिए this article पर एक नज़र डालें।

+0

धन्यवाद डैरेन; मैं शायद आपके सुझाव का उपयोग कर परीक्षण करूँगा, लेकिन फिलहाल मैं पीडीबी का उपयोग कर रहा हूं; तो मैं समझ सकता हूं कि कौन सा समस्याग्रस्त var है और एक ही गलती करने से बचें (मुझे रक्षात्मक कोडिंग पसंद है, लेकिन साथ ही मैं संभवतः पकड़ने के लिए चेक पर भरोसा करने के बजाय, पहले उदाहरण में गलती करने से बचना पसंद करता हूं गलती)। दिलचस्प है कि __class__ विशेषता भी है; कभी नहीं सुना। –

74
isinstance(obj, tuple) 
isinstance(obj, basestring) 
isinstance(obj, int) 
+0

उत्तर के लिए धन्यवाद; प्रोग्राम चलाने के दौरान यह चेक के लिए बहुत अच्छा है, लेकिन मैं पीडीबी के साथ डीबगिंग करते समय मूल्य प्राप्त करने की कोशिश कर रहा हूं। समस्या से बचने के लिए यह एक शानदार तरीका है! –

1

repr (ऑब्जेक्ट) ऑब्जेक्ट का एक टेक्स्ट विवरण देगा, जो प्रकार और मूल्य दिखाना चाहिए। आप डीबगर में इसे प्रिंट या देख सकते हैं।

साधारण मानों के लिए रिप्रर आमतौर पर एक ही स्ट्रिंग देता है क्योंकि आप मूल्य में अक्षर को सचमुच लिखते हैं। कस्टम वर्गों के लिए यह अगर class'es

__repr__ 

ओवरराइड की गई है वर्ग के नाम और ऑब्जेक्ट id, या कुछ और देता है।

+0

उत्तर जुर्गन के लिए धन्यवाद। मैंने repr की कोशिश की लेकिन यह मुझे मेरे मामले में स्ट्रिंग * का वैरिएबल * देता है, इसलिए यह वही करता है जो पी (वर्नाम) करता है ... क्या मैं कुछ गलत कर रहा हूं, क्योंकि मुझे आपके जैसा उल्लेख करना चाहिए, टाइप करें, वस्तु का मूल्य और विवरण? –

+1

नहीं। यह एक स्ट्र या यूनिकोड, * उद्धरण सहित * के लिए एक स्ट्रिंग अक्षर देता है, इसलिए आपको इसे उस प्रकार के रूप में पहचानना चाहिए। यह पूर्णांक प्रकारों के लिए unquoted अंक देता है और अन्य संख्यात्मक प्रकार के लिए समान है। कस्टम क्लास ए के लिए, यह डिफ़ॉल्ट रूप से लेकिन कुछ वर्ग इस वर्णन स्ट्रिंग को ओवरराइट करते हैं। –

+0

मैं देखता हूं; वास्तव में यह वास्तव में उपयोगी है, बहुत बहुत धन्यवाद !! –

1

कृपया ध्यान दें, क्या आप कथन में अपना var प्रकार देखना चाहते हैं, निर्माण if type(varname) == "tuple": काम नहीं करेगा। लेकिन ये होगा:

if type(varname) is tuple: 
if type(varname) is list: 
if type(varname) is dict: 
if type(varname) is int: 
if type(varname) is str: 
+0

आपको वास्तव में इसके बजाय isinstance का उपयोग करना चाहिए। जब विरासत की बात आती है तो टाइप() खतरनाक है। – bugmenot123

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