2016-05-22 7 views
1

Ich versuche, einige Daten zur MySQL-Datenbank über eine Schleife hinzuzufügen, die durch die API iteriert, die eine JSON-Datei zurückgibt. Ich benutze Python und MySQLdb Modul.MySQLdb Fehler lokale Variable vor der Zuweisung referenziert (anders als üblich)

Aus irgendeinem Grund bekomme ich den berüchtigten UnboundLocalError. Ich habe mir die anderen Szenarien angeschaut, als dieses Problem auftrat und die bereits auf StackOverflow beantwortet wurden, aber nichts stimmte mit mir überein und ich konnte es nicht direkt auf dieses Problem anwenden.

Hier ist mein Code:

def request(API_KEY, URL, ch_no): 
    url = URL + ch_no + '/request' 
    request = requests.get(url, auth=(API_KEY, '')) 
    data_dict = request.json() 
    data_dict_json_dumps = json.dumps(data_dict) 
    data = json.loads(data_dict_json_dumps) 

    try: 
     for item in data['items']: 
      return (item['tag'], item['created_on'], item['delivered_on'], item['satisfied_on'], item['status'], item['particulars']['description'], item['persons_entitled'][0]['name']) 
    except KeyError: 
     pass 

    try: 
     description = item['particulars']['description'] 
    except KeyError: 
     description = None 
    try: 
     persons_entitled = item['persons_entitled'][0]['name'] 
    except KeyError: 
     persons_entitled = None 

    try: 
     cursor.execute("""INSERT INTO companies_and_charges_tmp (tags, company_id, created, delivered, satisfied, status, description, persons_entitled) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""", (item.get('tag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, persons_entitled)) 
    db.commit() 

    finally: 
     time.sleep(0.5) 

    del data 

for ch_no in ch_nos: 
    charges_request(API_KEY, URL, ch_no) 

Und hier ist der vollständige Fehler:

Traceback (most recent call last): 
    File "test2.py", line 58, in <module> 
    charges_request(API_KEY, URL, ch_no) 
    File "test2.py", line 49, in charges_request 
    cursor.execute("""INSERT INTO companies_and_charges_tmp (etags, company_id, created, delivered, satisfied, status, description, persons_entitled) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""", (item.get('etag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, persons_entitled)) 
UnboundLocalError: local variable 'item' referenced before assignment 

Antwort

2

Das Problem ist, dass item nur zugewiesen, wenn Sie die for Schleife

eingeben
for item in data['items']: 
    ... 

Wenn data['items'] leer ist, tun Sie dies nie, und item bleibt nicht zugewiesen.

1

Seit diesem Skript iteriert durch die Schlaufe und einige der zurückgegebenen Variablen sind dann NULL Python (zu Recht) throws Der UnboundLocalError als Variable ist nicht da/wurde nicht deklariert.

ich versucht, dieses Problem zu umgehen, indem Sie:

except KeyError: 

jedoch die Fehler, die wir mit hier sind nicht nur KeyErrors sondern auch UnboundLocalErrors zu tun haben, so dass nur eine der Fehlerbehandlung nicht wirksam war.

modifizierte ich das Skript in der folgenden Art und Weise (beachten Sie dies in Python funktionieren 2.7 Ich bin nicht sicher, ob die gleiche Syntax in Python 3 möglich ist):

try: 
    description = item['particulars']['description'] 
except (UnboundLocalError, KeyError): 
    #declaring the description as None if not there so MySQL/Python don't throw an error 
    description = None 

und dann beim Hinzufügen von Daten zu MySQL-Datenbank ich verwende auch die Fehlerbehandlung und vorbei, wenn es einen gibt:

try: 
    cursor.execute("""INSERT INTO companies_and_charges_tmp (etags, company_id, created, delivered, satisfied, status, description, persons_entitled) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""", (item.get('etag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, persons_entitled)) 
    db.commit() 
except UnboundLocalError: 
    pass 
Verwandte Themen