2016-08-16 3 views
-2

Ich versuche, verschiedene Klasseninstanzen zu entkoppeln, die in separaten .pkl-Dateien gespeichert sind, indem ich über eine Liste mit allen Klasseninstanzen iteriert (jede Klasseninstanz hängt sich bei der Instanziierung an die entsprechende Liste an) . DieseKlasseninstanzen durch Interagieren über eine Liste entfernen

arbeitet:

# LOAD IN INGREDIENT INSTANCES 
for each in il: 
    with open('Ingredients/{}.pkl'.format(each), 'rb') as f: 
     globals()[each] = pickle.load(f) 

Zum Beispiel eine Zutat ist Aubergine:

print(Aubergine) 

Ausgang:

Name:   Aubergine 
Price:  £1.00 
Portion Size: 1 

Doch diese nicht arbeiten:

# LOAD IN RECIPE INSTANCES 
for each in rl: 
    with open('Recipes/{}.pkl'.format(each.name), 'rb') as f: 
     globals()[each] = pickle.load(f) 

kann ich nur annehmen, dass die Frage von each.name Stielen für die Dateinamen der Rezepte verwendet werden, während each für die Zutat Dateinamen verwendet wird. Dies ist jedoch beabsichtigt, da das name Attribut der Rezepte für den Endbenutzer formatiert ist (d. H. Leerraum usw. enthält). Ich denke, dies könnte das Problem sein, aber ich bin mir nicht sicher.

Sowohl die Zutat und Rezept-Klassen verwenden:

def __repr__(self): 
    return self.name 

Zum Beispiel:

Ich habe ein Rezept Klasseninstanz SausageAubergineRagu, für die self.name'Sausage & Aubergine Ragu' ist, und dies ist in der Liste rl. Ich habe versucht, testen diese individuell:

Eingang:

rl 

Ausgang:

[Sausage & Aubergine Ragu] 

Deshalb glaube ich, dass dieser Code:

# LOAD IN RECIPE INSTANCES 
for each in rl: 
    with open('Recipes/{}.pkl'.format(each.name), 'rb') as f: 
     globals()[each] = pickle.load(f) 

... in diese führen sollte :

with open('Recipes/Sausage & Aubergine Ragu.pkl', 'rb') as f: 
    globals()[SausageAubergineRagu] = pickle.load(f) 

Der Versuch, auf die Rezeptklasseninstanzen zuzugreifen, führt jedoch zu einem NameError.

Eine letzte Anmerkung - bitte nicht fragen, warum ich die Dinge so tue. Stattdessen hilf mir, das Problem anzugehen und zu lösen, damit ich es zum Laufen bringe und verstehe, was vor sich geht. Anerkannt :)

+0

Warum wird die Frage abgelehnt? –

Antwort

0

Die NameError Sie erhalten ist Python sagen Ihnen, dass Sie versuchen, eine Variable zu verwenden, die noch nicht definiert wurde.

Sie sind nicht SausageAubergineRagu definieren, bevor Sie es in dieser Zeile verwenden:

globals()[SausageAubergineRagu] = pickle.load(f) 

In Ihrem ersten Beispiel, Sie Schlüssel und Werte zu globals hinzufügen. Sie verwenden Instanzen von Rezepten (each) als Schlüssel und die gebeizten Daten als Werte.

In Ihrem zweiten Beispiel versuchen Sie, dasselbe zu tun, aber anstatt Instanzen von Rezepten (each) als Schlüssel zu verwenden, verwenden Sie SausageAubergineRagu, was nicht definiert ist.

Wie soll Python wissen, was SausageAubergineRagu ist? Wenn diese Zeile funktionieren soll, müssen Sie sie zuerst definieren oder ein bereits definiertes Element verwenden, z. B. each, was Sie in Ihrem anderen Code-Schnipsel tun.

Ehrlich gesagt, scheint mit Instanzen von benutzerdefinierten Klassen als Schlüssel in globals bizarr für mich sowieso (in der Regel Menschen Saiten verwenden), aber da du anscheinend machen wollen daran arbeiten, die Antwort ist einfach:

SausageAubergineRagu definieren, bevor Sie um es als Schlüssel in einem Wörterbuch zu verwenden.

+0

Ich versuche es zu definieren. Das ist der springende Punkt. Es funktioniert mit der Inhaltsstoffklasse, aber nicht mit der Rezeptklasse. In meiner Frage habe ich eine Instanz der Zutatklasseninstanz "Aubergine" gezeigt, die erfolgreich unpickled wurde. –

+0

@JakeStokes Siehe meine Bearbeitung. Ich habe einige Details hinzugefügt. – ballsatballsdotballs

+0

Okay, das erklärt den Namensfehler, wo ich versucht habe, in den Code zu schreiben, aber wenn es immer 'each' verwendet, funktioniert es immer noch nicht. Wenn ich den Code ausfühle und die Klasse anrufe sagt es ist nicht definiert. Irgendwelche Ideen? –

Verwandte Themen