2012-02-03 15 views
10

मेरे पास एक पायथन स्क्रिप्ट है जो एक .txt फ़ाइल को संसाधित करती है जिसमें रिपोर्ट उपयोग जानकारी होती है। मैं pprint के pprint (vars (ऑब्जेक्ट)) फ़ंक्शन का उपयोग करके ऑब्जेक्ट के गुणों को साफ़ रूप से मुद्रित करने का एक तरीका ढूंढना चाहता हूं।बिल्ट-इन __str __ (स्वयं) विधि का उपयोग करके किसी ऑब्जेक्ट को प्रिंट करने के लिए पप्रिंट का उपयोग कैसे करें?

स्क्रिप्ट फ़ाइल को पढ़ता है और रिपोर्ट क्लास के उदाहरण बनाता है। कक्षा यहाँ है।

class Report(object): 
    def __init__(self, line, headers): 
     self.date_added=get_column_by_header(line,headers,"Date Added") 
     self.user=get_column_by_header(line,headers,"Login ID") 
     self.report=get_column_by_header(line,headers,"Search/Report Description") 
     self.price=get_column_by_header(line,headers,"Price") 
     self.retail_price=get_column_by_header(line,headers,"Retail Price") 

    def __str__(self): 
     from pprint import pprint 
     return str(pprint(vars(self))) 

मैं सफाई से रिपोर्ट के उदाहरण मुद्रित करने के लिए एक-la-pprint सक्षम होने के लिए करना चाहते हैं।

for i,line in enumerate(open(path+file_1,'r')): 
    line=line.strip().split("|") 
    if i==0: 
     headers=line 

    if i==1: 
     record=Report(line,headers) 
     print record 

जब मैं रिपोर्ट का एक उदाहरण के लिए

print record 

कहते हैं, यह है कि क्या मैं खोल में मिलता है।

{'date_added': '1/3/2012 14:06', 
'price': '0', 
'report': 'some_report', 
'retail_price': '0.25', 
'user': 'some_username'} 
None 

मेरा प्रश्न दो गुना है।

सबसे पहले, क्या यह ऑब्जेक्ट के विशेषताओं को स्पष्ट रूप से मुद्रित करने का एक अच्छा/वांछित तरीका है? क्या पीप्रिंट के साथ या बिना ऐसा करने का कोई बेहतर तरीका है?

दूसरा, क्यों अंत में खोल करने के लिए

None 

प्रिंट करता है? मैं उलझन में हूं कि वह कहां से आ रहा है।

किसी भी सुझाव के लिए धन्यवाद।

+1

ओर टिप्पणी जब आप pprint आयात pprint से शामिल हैं, यदि आप केवल एक या दो बार यह ठीक है इस पद्धति का उपयोग कर रहे हैं, लेकिन एक आमतौर पर इस्तेमाल किया विधि के लिए इस मॉड्यूल को हर बार विधि कहा जाता है (कम्प्यूटेशनल रूप से गहन) आयात किया जा रहा है। मुझे लगता है कि शीर्ष पर आपके मॉड्यूल आयात करना बेहतर हो सकता है। इसके अलावा यह पाइथन स्क्रिप्ट में समग्र प्रदर्शन में सुधार करता है। – lukecampbell

+0

@ ल्यूकेकैम्पबेल - बाद में आयात के बारे में सच नहीं है जो कम्प्यूटेशनल गहन है। जब आप आयात करते हैं, तो यह देखने के लिए कि यह पहले से लोड हो चुका है, तंत्र sys.modules में एक ताना में दिखता है। यदि ऐसा है, तो कुछ और नहीं किया जाता है। केवल तभी आयात किया जाता है जब आयात तंत्र कुछ और करता है। – bgporter

+0

@bgporter: यदि आप ऑब्जेक्ट का एक और उदाहरण बनाते हैं तो क्या होगा? –

उत्तर

5

pprint प्रिंट का एक और रूप है। जब आप pprint(vars(self)) कहते हैं तो यह वर्ड को stdout में प्रिंट करता है और कोई भी नहीं देता क्योंकि यह एक शून्य कार्य है। तो जब आप इसे स्ट्रिंग में डालते हैं तो यह None (pprint द्वारा लौटाया जाता है) एक स्ट्रिंग में बदल जाता है जिसे प्रारंभिक प्रिंट स्टेटमेंट से मुद्रित किया जाता है। मैं आपके प्रिंट को pprint पर बदलने का सुझाव दूंगा या प्रिंट के रूप में प्रिंट को फिर से परिभाषित करूँगा यदि आप इसका उपयोग करते हैं।

def __str__(self): 
    return "date added: %s\nPrice:  %s\nReport:  %s\nretail price: %s\nuser:   %s" % tuple([str(i) for i in vars(self).values()]) 

आशा इस मदद की

+1

जबकि आपने सही ढंग से विफलता का निदान किया है, तो सुझाए गए समाधान सभी सुंदर हैं; pprint.pformat बहुत अधिक सुरुचिपूर्ण है। – Symmetric

11

pprint.pprint स्ट्रिंग वापस नहीं करता है; यह वास्तव में प्रिंटिंग करता है (डिफ़ॉल्ट रूप से stdout पर, लेकिन आप आउटपुट स्ट्रीम निर्दिष्ट कर सकते हैं)। तो जब आप print record लिखते हैं, record.__str__() कॉल किया जाता है, जो pprint पर कॉल करता है, जो None देता है। str(None)'None' है, और यह print एड हो जाता है, यही कारण है कि आप None देखते हैं।

आपको इसके बजाय pprint.pformat का उपयोग करना चाहिए। (वैकल्पिक रूप से, आप StringIO उदाहरण pprint पर आवृत्ति पास कर सकते हैं।)

3

सुंदर मुद्रण वस्तुओं जो अन्य वस्तुओं को शामिल, आदि pprint पर्याप्त नहीं है के लिए:

def __str__(self): 
    from pprint import pprint 
    return str(vars(self)) 

for i,line in enumerate(open(path+file_1,'r')): 
    line = line.strip().split("|") 
    if i == 0: 
     headers = line 
    if i == 1: 
     record = Report(line,headers) 
     pprint record 

एक वैकल्पिक एक स्वरूपित उत्पादन का प्रयोग है। IPython's lib.pretty आज़माएं, जो रूबी मॉड्यूल पर आधारित है।

from IPython.lib.pretty import pprint 
pprint(complex_object) 
11

दान के समाधान सिर्फ गलत है, और इस्माइल अधूरा में की।

  1. __str__() नहीं कहा जाता है, __repr__() कहा जाता है।
  2. __repr__() एक स्ट्रिंग वापस करना चाहिए, जैसा कि पोर्मेट करता है।
  3. प्रिंट आमतौर पर केवल 1 वर्ण इंडेंट करता है और लाइनों को सहेजने का प्रयास करता है। यदि आप संरचना को समझने की कोशिश कर रहे हैं, तो चौड़ाई कम और इंडेंट उच्च सेट करें।

यहाँ एक उदाहरण

class S: 
    def __repr__(self): 
     from pprint import pformat 
     return pformat(vars(self), indent=4, width=1) 

a = S() 
a.b = 'bee' 
a.c = {'cats': ['blacky', 'tiger'], 'dogs': ['rex', 'king'] } 
a.d = S() 
a.d.more_c = a.c 

print(a) 

यह प्रिंट

{ 'b': 'bee', 
    'c': { 'cats': [ 'blacky', 
         'tiger'], 
      'dogs': [ 'rex', 
         'king']}, 
    'd': { 'more_c': { 'cats': [ 'blacky', 
           'tiger'], 
        'dogs': [ 'rex', 
           'king']}}} 

कौन सा सही है, लेकिन प्रचलित नहीं है।

3

मुझे लगता है कि आपको beeprint की आवश्यकता है।

बस pip install beeprint और करने के लिए अपने कोड बदलने के लिए: __str__ में

def __str__(self): 
    from beeprint import pp 
    return pp(self, output=False) 
संबंधित मुद्दे