2011-01-11 17 views
5

मैं पाइथन में repr पढ़ रहा हूं। मैं सोच रहा था कि repr के आउटपुट का आवेदन क्या है। जैसेrepr उपयोगी का आउटपुट कब होता है?

class A: 
pass 

repr(A) ='<class __main__.A at 0x6f570>' 

b=A() 
repr(b) = '<__main__.A instance at 0x74d78>' 

जब एक '<class __main__.A at 0x6f570>' या '<__main__.A instance at 0x74d78>' में रुचि होगी?

उत्तर

4

कभी-कभी आप से निपटने के लिए या present a byte string जैसे

bob2='bob\xf0\xa4\xad\xa2' 

आप (उबंटू में) बाहर इस प्रिंट यदि आप

In [62]: print(bob2) 
bob 

जो समझने की कोशिश कर दूसरों के लिए बहुत उपयोगी नहीं है पाने के अपने बाइट स्ट्रिंग। टिप्पणियों में, जॉन बताते हैं कि विंडोज़ में, print(bob2) कुछ bob𤭢 जैसे परिणाम में हैं। समस्या यह है कि पायथन आपके टर्मिनल/कंसोल के डिफ़ॉल्ट एन्कोडिंग का पता लगाता है और उस एन्कोडिंग के अनुसार बाइट स्ट्रिंग को डीकोड करने का प्रयास करता है। चूंकि उबंटू और विंडोज क्रमशः विभिन्न डिफ़ॉल्ट एन्कोडिंग (संभावित रूप से utf-8 और cp1252) का उपयोग करते हैं, अलग-अलग परिणाम सामने आते हैं।

इसके विपरीत, एक स्ट्रिंग के रेपर स्पष्ट है:

In [63]: print(repr(bob2)) 
'bob\xf0\xa4\xad\xa2' 

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

सामान्य रूप से, प्रतिनिधि को वस्तु का एक स्पष्ट स्ट्रिंग प्रतिनिधित्व होना चाहिए। repr(obj) ऑब्जेक्ट obj की __repr__ विधि को कॉल करता है। चूंकि आपके उदाहरण में वर्ग A में कक्षा और मेमोरी एड्रेस को इंगित करने के लिए __repr__ विधि, repr(b) रिसॉर्ट्स नहीं हैं।

आप अधिक प्रासंगिक जानकारी देने के लिए __repr__ विधि को ओवरराइड कर सकते हैं।


अपने उदाहरण में, '<__main__.A instance at 0x74d78>' हमें दो उपयोगी बातें बताता है:

  1. कि b वर्ग का एक उदाहरण __main__ नाम स्थान में A है,
  2. और वस्तु स्मृति में रहता है कि पता 0x74d78 पर।

उदाहरण के लिए, आपके पास A कक्षा के दो उदाहरण हैं। यदि उनके पास एक ही स्मृति पता है तो आप जानते होंगे कि वे एक ही अंतर्निहित वस्तु को "इंगित कर रहे हैं"। (ध्यान दें कि यह जानकारी id का उपयोग करके भी प्राप्त की जा सकती है)।

+0

(0) कृपया अनुमानित/ज्ञात एन्कोडिंग (1) का उल्लेख किए बिना बाइट स्ट्रिंग्स के बारे में बात न करें (वास्तव में) कारण में वजन जोड़ना repr() का उपयोग करने के लिए, जब वे उस स्ट्रिंग को प्रिंट करते हैं तो सभी को उस सीजेके चरित्र को प्रदर्शित नहीं किया जाता है; विंडोज़ पर आईडीएलई में, एक को 'बॉब' प्राप्त होता है ... इसमें 'बॉब' के बाद 4 अक्षर होना चाहिए और मुझे आईडीई में 4 दिखाई दे रहा है लेकिन इस एसओ टिप्पणी में मैं केवल 3 देखता हूं; संभवतः \ xAD को मुलायम हाइफ़न के रूप में माना जाता है। (2) यूनिकोड तारों के लिए उपयोगी, न केवल बाइट तार। उदाहरण: 'u'bob \ U00024b62'' –

1

repr() का मुख्य उद्देश्य यह है कि यह इंटरेक्टिव दुभाषिया में और मानव-पठनीय रूप में वस्तुओं को प्रारूपित करने के लिए डीबगर में उपयोग किया जाता है। आपके द्वारा दिया गया उदाहरण मुख्य रूप से डिबगिंग उद्देश्यों के लिए उपयोगी है।

5

सैद्धांतिक रूप से, repr(obj) को स्ट्रिंग को थूकना चाहिए ताकि इसे ऑब्जेक्ट को फिर से बनाने के लिए eval में खिलाया जा सके। दूसरे शब्दों में,

obj2 = eval(repr(obj1)) 

ऑब्जेक्ट को पुन: उत्पन्न करना चाहिए।

अभ्यास में, repr अक्सर str का "लाइट" संस्करण होता है। str ऑब्जेक्ट के मानव-पठनीय रूप को मुद्रित कर सकता है, जबकि repr आमतौर पर डिबगिंग उद्देश्यों के लिए ऑब्जेक्ट की कक्षा जैसी जानकारी प्रिंट करता है। लेकिन उपयोगिता आपकी स्थिति पर बहुत निर्भर करती है और प्रश्न में वस्तु repr को कैसे संभालती है।

+0

सिर्फ यह पता करने की कोशिश की और मैं निम्नलिखित >>> obj = eval (रेपर (डब्ल्यू)) Traceback (सबसे हाल कॉल पिछले) मिल गया: फ़ाइल "", लाइन 1, में फ़ाइल "", लाइन 1 <__ मुख्य __। 0x74d78 पर एक उदाहरण> ^ सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास – shaz

+0

@shaz: क्या डब्ल्यू है? उदाहरण के लिए, 'w =' a string 'के साथ काम करना चाहिए। – nmichaels

+0

डब्ल्यू कक्षा ए का एक उदाहरण है, i.e w = ए() – shaz

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