मैं दो विधियों के साथ एक वर्ग बनाने की कोशिश कर रहा हूं: पहली विधि यह जांचने के लिए कि फ़ाइल को त्रुटियों के बिना डाउनलोड किया गया था और डाउनलोड की गई फ़ाइल को सहेजने के लिए दूसरी विधि। यह कोड काम करता है जैसा मैं चाहता हूं लेकिन यह फ़ाइल को दो बार डाउनलोड करता है। मैं फ़ाइल को दोबारा डाउनलोड किए बिना दूसरी विधि में पहली विधि से r चर का उपयोग करना चाहता हूं।

ईमेल भेजने का कार्य ठीक काम करता है।

from collections import OrderedDict
import requests

class checkGet_and_loads:
    # check if the get is successfull or not
    def get(self, url, file):
        # download the file    
        self.r = requests.get(url)

        # check if file was downloaded with no errors
        if self.r.status_code != 200:
            # send email to gmail
            # emailBody = 'Sending email. Error with downloading the ' + file + ' file.'
            # send_email( fromaddr = emailFrom, pwd = password, toaddr = emailTo, Subject = emailSubject, body = emailBody )
            print( 'Error: Unexpected response {}'.format(self.r) )

        else:
            print( ' Not sending email. No errors found when downloading the ' + file + ' file.' )

    # loads the json file
    def loads(self, url, file):
        # download the file
        self.r = requests.get(url)

        # loads the json file
        self.to_loads = json.loads( self.r.text, object_pairs_hook = OrderedDict )
        return( self.to_loads )

# Check if test file is downloaded without errors. If errors found while downloading then send email; otherwise, don't email
# link for test file
url = 'http://mysafeinfo.com/api/data?list=englishmonarchs&format=json'
file = 'test'

checkGet_and_loads().get(url, file)

test_json = checkGet_and_loads().loads(url, file)

तो दूसरी विधि इस तरह दिखनी चाहिए:

    # loads the json file
    def loads(self):
        # loads the json file
        to_loads = json.loads( self.r.text, object_pairs_hook = OrderedDict )
        return(to_loads)

लेकिन, मुझे यह त्रुटि मिलती है:

विशेषता त्रुटि: 'checkGet_and_loads' ऑब्जेक्ट में कोई विशेषता नहीं है 'r'

मैंने SO और अन्य साइटों पर सभी समाधानों की कोशिश की और इसे समझ नहीं पाया ...

1
nick 30 अप्रैल 2017, 22:35

2 जवाब

सबसे बढ़िया उत्तर

क्योंकि आप एक अस्थायी वस्तु बना रहे हैं और फिर एक नई वस्तु बना रहे हैं:

checkGet_and_loads().get(url, file)
test_json = checkGet_and_loads().loads(url, file)

यह होना चाहिए:

data_source = checkGet_and_loads()
data_source.get(url, file)
test_json = data_source.loads()

फिर आपको .loads फ़ंक्शन में requests.get को कॉल करने की आवश्यकता नहीं होगी।

1
m0nhawk 30 अप्रैल 2017, 22:55

मुझे लगता है कि आपको जो चाहिए वह बहुत आसान हासिल किया जा सकता है। अगर आपके पास ऐसी कक्षा है जहां केवल दो विधियां हैं और उनमें से एक __init__ है, तो यह एक फ़ंक्शन. आपके मामले में आपके पास init भी नहीं है।

def load_file(url, filename):
    response = r.get(url)
    if response.status == 200:
        with open(filename, 'w') as f:
            json.dump(f, response.json(object_pairs_hook=OrderedDict))

आप raise CustomException() कर सकते हैं यदि status 200 नहीं है और फिर उसे पकड़ कर त्रुटियों को लॉग करें।

मैं अजगर कोड शैली (PEP8) को पढ़ने का भी सुझाव देता हूं

1
user1685095 30 अप्रैल 2017, 22:48